我什么时候应该在 Objective-C 中释放这些对象?

发布于 2024-12-08 21:58:08 字数 718 浏览 0 评论 0原文

我是 obj-c 编程新手。那么,我什么时候释放定义的对象呢? 我必须释放 urlRequest、响应、数据和内容吗?

- (NSString*)getContentFromUrl:(NSURL*)url {
    NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] init];
        [urlRequest setHTTPMethod:@"GET"];
        [urlRequest setURL:url];
    NSHTTPURLResponse *response = NULL;
    NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest 
                            returningResponse:&response 
                            error:nil];
    NSString *content = NULL;
    if ([response statusCode] >= 200) {
        content = [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding];
    }
    [content autorelease];
    return content;
}

I'm new in programming obj-c. So, when shall i release the defined objects?
Do i have to release urlRequest, response, data and content?

- (NSString*)getContentFromUrl:(NSURL*)url {
    NSMutableURLRequest *urlRequest = [[NSMutableURLRequest alloc] init];
        [urlRequest setHTTPMethod:@"GET"];
        [urlRequest setURL:url];
    NSHTTPURLResponse *response = NULL;
    NSData *data = [NSURLConnection sendSynchronousRequest:urlRequest 
                            returningResponse:&response 
                            error:nil];
    NSString *content = NULL;
    if ([response statusCode] >= 200) {
        content = [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding];
    }
    [content autorelease];
    return content;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

牵你手 2024-12-15 21:58:08

您只需释放urlRequestresponsedata 已作为自动释放对象创建,并且 content 在返回之前接收自动释放消息(我建议仅使用 更改最后两行>返回[内容自动释放])。

将对象指针初始化为 nil 而不是 NULL 也更常见。

Cocoa 有一个约定,如果您在初始化或重新分配时对任何对象调用 alloccopyretainnew您必须release它们,除非它们在创建后收到autorelease消息。

您可以从代码中看到,只有 urlRequestcontent 变量是使用 alloc 方法创建的,因此必须[auto]释放它们。

更新注意评论

如果您将urlRequest作为实例变量,则先前启动的变量可能会影响ivar,并且您可能会遇到各种麻烦(例如EXC_BAD_ACCESS)。您最好为局部变量选择一个不同的名称。

You have to release urlRequest only. response, data are created already as autoreleased objects and content receives autorelease message before return (I'd suggest changing last two lines with just return [content autorelease]).

It's also more common to initialize object pointers to nil rather than NULL.

Cocoa has a convention if you call alloc, copy, retain or new on any of objects while initializing or reassigning them you have to release them unless they receive autorelease message after creation.

You can see from your code that only urlRequest and content variables are created using alloc method, hence they have to be [auto]released.

update minding the comments

If you have urlRequest as an instance variable the previously initiated variable can shadow the ivar and you may get into various troubles (like EXC_BAD_ACCESS). You better pick a different name for your local variable.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文