-retainCount
is not reliable。
重要:此方法在調試內存管理問題時通常沒有任何價值。因爲任何數量的框架對象都可能保留了一個對象以保存對它的引用,同時autorelease池可能在對象上保存了任意數量的延遲發佈,所以很難從此獲得有用的信息方法。
在你的情況,具體的原因是因爲-subview
也導致所有子視圖要保留一次,由複製的.layer.sublayers
值到一個新的數組*:
UILabel* label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];
NSLog(@"%d", [label retainCount]); // 1
[someView addSubview:label];
NSLog(@"%d", [label retainCount]); // 2
[someView subviews];
NSLog(@"%d", [label retainCount]); // 3
有沒有必要擔心它,因爲數組是autoreleased,並且retainCount將在以後回落到2。您所需要的只是確保當前功能導致的淨保留計數與所有權狀態一致。
*:中.subviews
具體實現是:
-(NSArray*)subviews {
// irrelevant ... snipped
NSArray* sublayers = [_layer.sublayers copy];
int count = [sublayers count];
// irrelevant ... snipped
res = CFArrayCreateMutable(NULL, count, &kCFTypeArrayCallBacks);
for (int i = 0; i < count; ++ i) {
UIView* view = _UIView([sublayers objectAtIndex:i]);
if (view)
CFArrayAppendValue(res, view);
// ^-- this causes an extra -retain to each subview.
}
// irrelevant ... snipped
}
你看了上retainCount的文檔? 」 ...「 – user123444555621 2010-07-26 06:46:40
我已經閱讀了」初學者「的文檔,它說保留計數器增加,當」alloc/copy/new「發生時,並且減少,當發佈時調用。 如果你有具體的文檔 - 請與我分享一個鏈接到它 – 2010-07-26 07:03:02