我需要保留自动释放对象吗?

5

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

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl];

根据命名规则,我不需要保留请求对象,对吗? 但是当我查看requestWithURL:someUrl方法的代码时,我可以看到:

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

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

5

如果你在一个方法中使用自动释放对象,你就不应该进行retain操作,所以这是可以的:

- (void) myMethodDoRequest
{
    ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl];
    // use request within this scope only
}

如果你想在实例变量中存储autorelease对象,你需要对其进行retain操作以扩展对象的生命周期,然后再进行release操作以避免内存泄漏:

@interface MyClass
{
    ASIFormDataRequest *request;
}

并且

- (void) myMethodStoreRequest
{
    [request release];
    request = [[ASIFormDataRequest requestWithURL:someUrl] retain];
}

- (void) dealloc
{
    [request release];
}

3
一般来说不需要 - 因为它是自动释放的,会被自动释放池所保留,当它超出范围时即可释放。但是,如果你处于需要提供额外安全性的情况下,可以先进行保留再进行释放。

但是,如果我不保留这个对象,那么自动释放池可能会释放它,我最终会得到一个无效的对象,对吗? - Jakub
这取决于你的架构,但我认为不会出现问题(以我的经验来看,我自己没有遇到过任何错误)。然而,如果你有保留再释放的范围,那么也不会有任何损害! - Andiih

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接