我正在使用ASIHTTPRequest库,我想确保从内存管理的角度来看我是否以良好的方式使用它。 我创建:
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl];
我想根据命名约定我不必保留请求对象,对吧? 但是当我查看requestWithURL:someUrl方法的代码时,我可以看到:
+ (id)requestWithURL:(NSURL *)newURL
{
return [[[self alloc] initWithURL:newURL] autorelease];
}
所以返回的对象是自动释放的。我不应该在代码中保留它吗?
答案 0 :(得分:4)
如果在方法中使用autorelease对象,则不应保留,所以这没关系:
- (void) myMethodDoRequest
{
ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl];
// use request within this scope only
}
如果要将自动释放对象存储在ivar中,则必须保留以扩展对象的生命周期,然后释放以避免泄漏:
@interface MyClass
{
ASIFormDataRequest *request;
}
和
- (void) myMethodStoreRequest
{
[request release];
request = [[ASIFormDataRequest requestWithURL:someUrl] retain];
}
- (void) dealloc
{
[request release];
}
答案 1 :(得分:3)
一般情况下没有 - 因为它是自动释放的,它由自动释放池保留,并且当它超出范围时将释放它。但是,如果您需要提供额外的安全性,则可以保留然后释放它。