在通過xib加載視圖的時候,我們遵循一個准側
那就是頂層視圖 我們的成員變量要是強引用 若是非頂層視圖,而是頂層視圖的子視圖,為了防止頂層視圖被釋放以後,字視圖還存在而造成的內存洩漏,我們把這字視圖的成員變量定義為弱飲用
現在問題是,在ARC模式下,假如我有個視圖控制起ViewController,然後有個UIButton子視圖
@interface ViewController:UIViewController
{
weak/strong IBOutlet UIButton* button;
}
這時,在ARC模式下,無論我是指定它是強引用,還是弱引用,在加載了xib文件中(xib中設置了button和一個UIButton的關聯),用
NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)button));方法查看button的retainCount,都一樣是3
所以我就不了解了,不是強應用會使對象的retainCount加1,而弱引用不會影響對象的retainCount嗎?怎麼無論用strong還是weak,得到的retainCount都是相同值呢?
在加載xib文件時,底層到底是怎樣給button賦值的?
真的想不明白,請各位大神指教一下,不勝感激
這個跟你是不是 xib 沒關系的, 就算你用代碼創建也是一樣,對於你的問題,給你看個例子
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(0, 40, 30, 30)];
label.backgroundColor = [UIColor yellowColor];
NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)label));
[self.view addSubview:label];
NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)label));
__weak UILabel *aLabel = label;
NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)label));
NSLog(@"Retain count is %ld", CFGetRetainCount((__bridge CFTypeRef)aLabel));
輸出是:1,2,2,3
這跟我們以前的理解方式很不同,它僅僅是 weak 變量的 retainCount +1 ,而沒有影響到其他變量。所以 weak 的 retainCount 管理是獨立的。當只剩下 weak 引用時,就會被自動清零並釋放