2010-06-09 61 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]; 
} 
相關問題