2010-06-09 86 views
4

我正在使用ASIHTTPRequest库,并且我想确定从内存管理的角度来看,如果我使用它是一种很好的方式。 创建:我是否需要保留自动释放对象?

ASIFormDataRequest *request = [ASIFormDataRequest requestWithURL:someUrl]; 

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

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

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

回答

3

通常不会 - 因为它是自动释放的,所以它保留在自动释放池中,并在超出范围时释放它。但是,如果您处于需要提供额外安全性的情况,则可以保留并释放它。

+0

不过,如果我不保留该对象可能是自动释放池将释放它,我最终会得到一个无效的对象,对吧? – Jakub 2010-06-09 14:28:39

+0

这取决于你的架构,但我不这么认为(我自己没有犯过任何错误,但是,如果你有足够的空间保留然后释放,你就不会有任何伤害! – Andiih 2010-06-09 17:30:24

4

如果您使用的方法内自动释放的对象,你不应该保留,所以这是好的:

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

如果你想存储在伊娃的自动释放对象,你必须保持扩大的生命周期对象,后者释放性,避免漏:

@interface MyClass 
{ 
    ASIFormDataRequest *request; 
} 

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

- (void) dealloc 
{ 
    [request release]; 
} 
相关问题