創建一個ARC新項目並在didFinishLaunchingWithOptions中注入此代碼。NSNumber可能的內存泄漏
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循環結束時內存不會流失。
所以,問題仍然存在。
有趣..等待專家的意見就這一個.. – rdurand
如果你把'@autoreleasepool {...}'周圍的'for'聲明? – trojanfoe
您是否嘗試過其他基礎課程?另一種類型的init(例如initWithBool)呢? – rdurand