我啥时候应该在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】:您只需释放urlRequest
。 response
、data
已作为自动释放对象创建,content
在返回前收到自动释放消息(我建议只用 return [content autorelease]
更改最后两行)。
将对象指针初始化为nil
而不是NULL
也更为常见。
Cocoa 有一个约定,如果您在初始化或重新分配对象时对任何对象调用 alloc
、copy
、retain
或 new
,则必须使用 release
它们,除非它们在创建后收到 autorelease
消息.
您可以从您的代码中看到,只有urlRequest
和content
变量是使用alloc
方法创建的,因此它们必须[自动] 释放。
更新关注 cmets
如果您将urlRequest
作为实例变量,则先前启动的变量可能会影响 ivar,您可能会遇到各种麻烦(例如EXC_BAD_ACCESS
)。你最好为你的局部变量选择一个不同的名字。
【讨论】:
好的,谢谢。它现在可以工作,但是如果我释放 urlRequest 并多次执行该方法,我会收到 EXC_BAD_ACCESS 错误。你有什么建议吗? 取决于您在哪里发布urlRequest
变量。
可以在data
变量初始化后立即释放。
但是当我在数据变量初始化后发送 [urlRequest release] 或 autorelease 时,它会以'线程 5:程序接收信号:“EXC_BAD_ACCESS”'而中断
我不知道我是否真的是 urlRequest 的所有者...因为如果我在初始化时保留 urlRequest,我可以在数据初始化后发送发布消息。 (很奇怪,但是这样我就可以理解内存管理了)以上是关于我啥时候应该在objective-c中释放这些对象?的主要内容,如果未能解决你的问题,请参考以下文章
我啥时候应该使用 PHP 会话、浏览器本地存储和 JavaScript 对象参数?