2012-10-30 34 views
0

您可以在應用程序中創建多少個autorelease?有沒有限制?在ios中使用autorelease池的限制

我在谷歌搜索了一個答案,但沒有得到任何有用的信息。

而且

int main(){ 

NSAutoreleasepool *pool = [NSAutoreleasepool alloc]init]; 

NSString *str = [NSString alloc]init]; 

[pool drain]; 
} 

在谷歌,我在幾乎所有的文章發現這個樣品。 使用上面的代碼,如果我們在Xcode中進行分析,它會引發內存泄漏。相反,如果我們以這種方式分配str NSString * str = [NSString alloc] init] autorelease;

然後它不會拋出任何內存泄漏。

哪種方式是正確的。

同樣在上面的代碼中,我發現當[pool drain]語句被執行時,變量str被釋放。當我們使用「@autorelease」關鍵字而不是NSAutoreleasePool編寫相同的代碼時,會發生什麼情況。我的意思是,如果我們使用@autorelease,就不會有像[pool drain]這樣的聲明。

我的意思是這樣

int main(){ 

@autorelease{ 
NSString *str = [NSString alloc]init]; 
} 
} 

感謝 Jithen

+1

你可以使用盡可能多的你想要但你需要知道在哪裏以及如何使用它 –

回答

3

使用的NSAutoreleasePool@autorelease是不固定的內存泄漏。它們的用途是幫助控制何時釋放自動釋放對象的範圍。無論您是否使用任何autorelease池,您都需要進行適當的內存管理。

在您發佈的第一個代碼塊中,由於您分配了一個字符串,但您從未在該對象上調用release,所以會發生內存泄漏。在這種情況下,str不是一個自動釋放對象。 autorelease池對這個對象沒有影響。

當您在字符串上添加對autorelease的調用時,該對象會在某個時間排隊等待自動釋放。排空autorelease池會觸發該版本。

您使用@autorlease的最後一個代碼與第一個代碼塊相同。你沒有正確地釋放str,所以它會泄漏。但是,這與自動釋放池無關。

啓用ARC將修復您發佈的第一個和最後一個代碼塊的問題。 ARC會照顧爲你釋放str

編輯:如上面的註釋中所述,您可以擁有儘可能多的自動釋放池,因爲您需要控制自動釋放對象何時被釋放。