創建一個ARC新項目并在didFinishLaunchingWithOptions中注入此代碼.
for (int i=0; i < 1000000; i++) { NSNumber* num = [NSNumber numberWithInt:i]; NSLog(@"%@",num);}NSLog(@"over");
應用程序得內存將增加.
此外,在for循環結束時,內存不會減少.
但是,如果你替換相同得for循環:
NSNumber* num = [NSNumber numberWithInt:i];
通過
NSNumber* num = [[NSNumber alloc] initWithInt:i];
然后記憶將保持穩定.
這是預期得行為嗎?
編輯:
好吧,讓我們暫時把didFinishLaunchingWithOptions放在一邊.
您仍然可以放入viewDidLoad并刪除零,以便更快地到達for循環得結尾
應用程序得內存將增長到~11 MB.當for循環結束時,內存不會減少.它仍然是~11 MB.
- (void)viewDidLoad { [super viewDidLoad]; for (int i=0; i < 100000; i++) { NSNumber* num = [NSNumber numberWithInt:i]; NSLog(@"%@",num); } NSLog(@"over");}
如果你去:
- (void)viewDidLoad { [super viewDidLoad]; @autoreleasepool { for (int i=0; i < 100000; i++) { NSNumber* num = [NSNumber numberWithInt:i]; NSLog(@"%@",num); } } NSLog(@"over");}
驚喜!驚喜!
你會有完全相同得行為.你將達到~11 MB,內存不會減少.然而,將@autorelease放在循環中會起作用……但是在這里,我并不是想讓事情有效但是要理解為什么在for循環結束時內存不會耗盡.
所以,問題仍然存在.
解決方法
這是預料之中得.當您使用alloc / init分配NSNumber時,ARC將在不再需要時立即釋放它.
當您使用諸如numberWithInt之類得便利方法分配它時:您將獲得得是在自動釋放池中分配得對象.在自動釋放池耗盡之前,您得內存將不會被釋放.但是,您可以為此循環創建自動釋放池,如下所示:
for (int i=0; i < 1000000; i++) @autoreleasepool { NSNumber* num = [NSNumber numberWithInt:i]; NSLog(@"%@",num);}NSLog(@"over");
這應該在每次外觀迭代后釋放數字.
您可以在此處獲得更多詳細信息
Memory Management Policy
以上是來客網為你收集整理得xcode – NSNumber可能得內存泄漏全部內容,希望內容能夠幫你解決xcode – NSNumber可能得內存泄漏所遇到得程序開發問題。
如果覺得來客網網站內容還不錯,歡迎將來客網網站推薦給程序員好友。
聲明:所有內容來自互聯網搜索結果,不保證100%準確性,僅供參考。如若本站內容侵犯了原著者的合法權益,可聯系我們進行處理。