簡體   English   中英

限制在ios中使用自動釋放池

[英]limit on using autorelease pools in ios

您可以在應用程序中創建多少個自動發布? 有沒有限制?

我在Google中搜索了答案,但沒有得到任何有用的信息。

int main(){

NSAutoreleasepool *pool = [NSAutoreleasepool alloc]init];

NSString *str = [NSString alloc]init];

[pool drain];
}

在google中,我幾乎在所有文章中都找到了此示例。 使用上面的代碼,如果我們在Xcode中進行分析,則會引發內存泄漏。 相反,如果我們以這種方式分配str,則NSString * str = [NSString alloc] init] autorelease;

那么它不會引發任何內存泄漏。

哪種方法是正確的。

同樣在上面的代碼中,我發現執行[poolrain]語句時會釋放變量str。 當我們使用“ @autorelease”關鍵字而不是NSAutoreleasePool編寫相同的代碼時,會發生什么。 我的意思是,如果我們使用@autorelease,將不會有類似[poolrain]的語句。

我的意思是這樣

int main(){

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

謝謝吉森

使用NSAutoreleasePool@autorelease並非用於修復內存泄漏。 它們的用途是幫助控制何時釋放自動釋放的對象的范圍。 無論是否使用任何自動釋放池,都需要進行適當的內存管理。

在發布的第一段代碼中,由於分配了字符串,但從未在對象上調用release ,因此會發生內存泄漏。 在這種情況下, str不是自動釋放的對象。 自動釋放池對此對象無效。

當您在字符串上添加了對autorelease的調用時,該對象將排隊等待自動釋放。 耗盡自動釋放池將觸發該釋放。

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

啟用ARC可以解決您發布的代碼的第一個和最后一個塊的問題。 ARC會為您釋放str

編輯:並且正如上面的注釋中所述,您可以根據需要控制自動釋放對象實際釋放的時間,並且可以具有多個自動釋放池。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM