在OC的API中使用,readonly 和 copy聲明,一般都是一個計算值,而在循環體中直接使用計算屬性則會大量消耗內存,此時最好的解決辦法是在獲取某個計算屬性使用autoreleasepool來降低內存峰值, 另外autorelease的值在循環中也會大量消耗內存,當然也可以使用autoreleasepool來降低內存峰值;
高內存
低內存
下面兩個測試例子
低內存:
while (true) {
NSString *a = [[NSString alloc] initWithFormat:@"test"];
}
高內存:
while (true) {
NSString *a = [NSString stringWithFormat:@"test"];
}
當然上面的高內存版,使用autoreleasepool可以降低內存
while (true) {
@autoreleasepool {
NSString *a = [NSString stringWithFormat:@"test"];
}
}
對于每一個Runloop, 系統會隱式創建一個Autorelease pool, 這樣所有的release pool會構成一個象CallStack一樣的一個棧式結構,在每一個Runloop結束時,當前棧頂的Autorelease pool會被銷毀,這樣這個pool里的每個Object會被release。
一個UI事件、Timer call、 delegate call、 都會是一個新的Runloop。
實際上對于 [NSString stringWithFormat:] 這類構造函數返回的對象都是autorelease的。
autorelease pool來避免頻繁申請/釋放內存(就是pool的作用了)!
總結:
1.一定要注意Autorelease pool的生存周期,理解Runloop,避免在對象被釋放后使用。
2.[NSString stringWithFormat:]這類函數返回的對象是不需要再自己release的,它已經被autorelease了, MRC下如果你想把它當一個全局對象使用,那必須自己再retain, 釋放時再release。
高內存
低內存