我是否需要保留自动释放的对象?

时间:2010-06-09 09:43:14

标签: iphone memory-management asihttprequest

我正在使用ASIHTTPRequest库,我想确保从内存管理的角度来看我是否以良好的方式使用它。 我创建:

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl];

我想根据命名约定我不必保留请求对象,对吧? 但是当我查看requestWithURL:someUrl方法的代码时,我可以看到:

+ (id)requestWithURL:(NSURL *)newURL
{
return [[[self alloc] initWithURL:newURL] autorelease];
}

所以返回的对象是自动释放的。我不应该在代码中保留它吗?

2 个答案:

答案 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)

一般情况下没有 - 因为它是自动释放的,它由自动释放池保留,并且当它超出范围时将释放它。但是,如果您需要提供额外的安全性,则可以保留然后释放它。