5

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

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl];

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

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

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

4

2 回答 2

5

如果在方法中使用 autorelease 对象,则不应保留,因此可以:

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

如果要将 autorelease 对象存储在 ivar 中,则必须保留以扩展对象的生命周期,并稍后释放以避免泄漏:

@interface MyClass
{
    ASIFormDataRequest *request;
}

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

- (void) dealloc
{
    [request release];
}
于 2011-10-21T09:01:28.403 回答
3

通常不会 - 因为它是自动释放的,它由自动释放池保留,当它超出范围时会释放它。但是,如果您需要提供额外的安全性,您可以保留然后释放它。

于 2010-06-09T10:53:42.787 回答