我啥时候应该在objective-c中释放这些对象?

Posted

技术标签:

【中文标题】我啥时候应该在objective-c中释放这些对象?【英文标题】:When shall i release these objects in objective-c?我什么时候应该在objective-c中释放这些对象? 【发布时间】:2011-10-10 11:47:56 【问题描述】:

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

- (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;

【问题讨论】:

【参考方案1】:

您只需释放urlRequestresponsedata 已作为自动释放对象创建,content 在返回前收到自动释放消息(我建议只用 return [content autorelease] 更改最后两行)。

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

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

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

更新关注 cmets

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

【讨论】:

好的,谢谢。它现在可以工作,但是如果我释放 urlRequest 并多次执行该方法,我会收到 EXC_BAD_ACCESS 错误。你有什么建议吗? 取决于您在哪里发布 urlRequest 变量。 可以在data变量初始化后立即释放。 但是当我在数据变量初始化后发送 [urlRequest release] 或 autorelease 时,它​​会以'线程 5:程序接收信号:“EXC_BAD_ACCESS”'而中断 我不知道我是否真的是 urlRequest 的所有者...因为如果我在初始化时保留 urlRequest,我可以在数据初始化后发送发布消息。 (很奇怪,但是这样我就可以理解内存管理了)

以上是关于我啥时候应该在objective-c中释放这些对象?的主要内容,如果未能解决你的问题,请参考以下文章

我啥时候应该在课堂上使用“this”?

我啥时候应该使用 PHP 会话、浏览器本地存储和 JavaScript 对象参数?

我啥时候应该使用结构而不是类?

我啥时候应该在 JavaScript 中使用 delete vs 将元素设置为 null? [复制]

我啥时候应该在 NavLink 上使用 Link?

我啥时候应该在 django 模型字段上使用 null=False