[英]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.