在 ARC 環境下,通過 XIB 加載視圖時,頂層視圖使用強引用,子視圖(如 UIButton)無論標記為 strong 還是 weak,調用 CFGetRetainCount 獲取的計數均為 3。這與預期「強引用增加計數、弱引用不影響計數」不符,令人困惑。
這與 XIB 無關,屬於 ARC 運行時機制。示例代碼驗證:
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 40, 30, 30)];
label.backgroundColor = [UIColor yellowColor];
NSLog(@"Retain count: %ld", CFGetRetainCount((__bridge CFTypeRef)label)); // 1
[self.view addSubview:label];
NSLog(@"Retain count: %ld", CFGetRetainCount((__bridge CFTypeRef)label)); // 2
__weak UILabel *aLabel = label;
NSLog(@"Retain count: %ld", CFGetRetainCount((__bridge CFTypeRef)label)); // 2
NSLog(@"Weak ref count: %ld", CFGetRetainCount((__bridge CFTypeRef)aLabel)); // 3
關鍵結論:
CFGetRetainCount 返回的是對象的「側表」引用計數,包含強引用、弱引用側表條目、自動釋放池等內部機制,不等同於語義上的強引用數。retainCount 進行邏輯判斷,它不可靠且屬實現細節。