首先讓我們對你做了什麼樣子:
NSMutableArray *a = [NSMutableArray array];
for(int i=0;i<8000000;i++){
[a addObject:[NSValue valueWithPoint:NSMakePoint(i, 0)]];
}
a = nil;
創建autorelease池中的數組,並在autorelease池中創建一些值對象。自動發佈的數組包含值對象。
答:只要有一個autorelease池,沒有任何對象將被釋放。 autorelease池保留它們。因此設置a
到nil
不會真的有幫助。只要自動釋放池保留的對象,放棄私人蔘考不能把引用計數爲0
有兩種技術,以避免:
一個。正如@sunshine所提到的,您可以安裝本地自動釋放池。這將保存對象而不是更全局的自動釋放池,從而更早地釋放對象。 (但正如@HotLicks所說,如果應該放在整個片段之外)。
b。不要在autorelease池中創建對象。
NSMutableArray *a = [NSMutableArray new]; // new is ownership transfer
for(int i=0;i<8000000;i++) {
CGPoint point = NSMakePoint(i, 0);
[a addObject:[[NSValue alloc] initWithBytes:&point withObjCType:withObjCType:@encode(CGPoint)];
}
a = nil;
B.有可能您仍然有「幽靈般的」物體。這可能是因爲某些價值等級(即NSNumber
)永遠不會釋放一些在不久的將來被重新使用的對象。當使用valueWithPoint:
時,可能NSValue
也是如此。沒有相應的-initWithPoint:
是一個指針。
如果您告訴我們,您可以期待更好的信息,您如何衡量內存消耗。 「ARC」沒有回答這個問題,因爲它是一個內存管理模型,沒有內存測量工具。
請描述你如何測量內存消耗。 – user3125367
我已經使用了ARC – LERO
你是如何測量內存消耗的? –