自動釋放池
作用
- 自動釋放對象的
- 所有
autorelease
的對象,在出了作用域之後,會被自動添加到最近創建的
自動釋放池中 - 自動釋放池被銷燬或者耗盡時,會向池中所有對象發送
release
消息,釋放池中對象 - 自動釋放池,在
ARC
&MRC
程序中,同樣有效
高級面試題:
自動釋放池是什麼時候創建的?什麼時候銷燬的?
創建,運行循環檢測到事件並啓動後,就會創建自動釋放池
- 銷燬:一次完整的運行循環結束之前,會被銷燬
- 常見面試題
for (long i = 0; i < largeNumber; ++i) {
NSString *str = [NSString stringWithFormat:@"hello - %ld", i];
str = [str uppercaseString];
str = [str stringByAppendingString:@" - world"];
}
提問:以上代碼是否有問題?如果有,如何解決?
解決方法:引入自動釋放池
- 1> 外面加自動釋放池(快):能夠保證for循環結束後,內部產生的自動釋放對象,都會被銷燬
需要等到 for 結束後,纔會釋放內存 - 2> 裏面加自動釋放池(慢):能夠每一次 for 都釋放產生的自動釋放對象!
- 1> 外面加自動釋放池(快):能夠保證for循環結束後,內部產生的自動釋放對象,都會被銷燬
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
NSLog(@"start");
CFAbsoluteTime start = CFAbsoluteTimeGetCurrent();
[self answer1];
NSLog(@"外 %f", CFAbsoluteTimeGetCurrent() - start);
start = CFAbsoluteTimeGetCurrent();
[self answer2];
NSLog(@"內 %f", CFAbsoluteTimeGetCurrent() - start);
}
- (void)answer1 {
@autoreleasepool {
for (long i = 0; i < largeNumber; ++i) {
NSString *str = [NSString stringWithFormat:@"hello - %ld", i];
str = [str uppercaseString];
str = [str stringByAppendingString:@" - world"];
}
}
}
- (void)answer2 {
for (long i = 0; i < largeNumber; ++i) {
@autoreleasepool {
NSString *str = [NSString stringWithFormat:@"hello - %ld", i];
str = [str uppercaseString];
str = [str stringByAppendingString:@" - world"];
}
}
}
- 實際測試結果,是運行循環放在內部的速度更快!
- 日常開發中,如果遇到局部代碼內存峯值很高,可以引入運行循環及時釋放延遲釋放對象