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

Jak*_*kub 5 iphone memory-management asihttprequest

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

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl];
Run Code Online (Sandbox Code Playgroud)

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

+ (id)requestWithURL:(NSURL *)newURL
{
return [[[self alloc] initWithURL:newURL] autorelease];
}
Run Code Online (Sandbox Code Playgroud)

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

Iva*_*nov 5

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

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

如果你想在 ivar 中存储 autorelease 对象,你必须保留以扩展对象的生命周期,然后释放以避免泄漏:

@interface MyClass
{
    ASIFormDataRequest *request;
}
Run Code Online (Sandbox Code Playgroud)

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

- (void) dealloc
{
    [request release];
}
Run Code Online (Sandbox Code Playgroud)


And*_*iih 3

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