@property (nonatomic, weak) UIView *weakView;
@property (nonatomic, strong) UIView *strongView;
- (void)viewDidLoad {
[super viewDidLoad];
self.strongView = [[UIView alloc]initWithFrame:CGRectMake(25, 25, 50, 50)];
printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(self.strongView)));
[self.view addSubview:self.strongView];
printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(self.strongView)));
_strongView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));
[self.view addSubview:self.strongView];
printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));
UIView *selfView = [[UIView alloc]initWithFrame:CGRectMake(150, 150, 50, 50)];
self.weakView = selfView;
printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(self.weakView)));
[self.view addSubview:self.weakView];
printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(self.weakView)));
UIView *weaksView = [[UIView alloc]initWithFrame:CGRectMake(200, 200, 50, 50)];
printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(weaksView)));
_weakView = weaksView;
printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));
[self.view addSubview:_weakView];
printf("%ld",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));
}
請按順序?qū)懗錾鲜龃蛴〗Y(jié)果呻右。
答案如下
self.selfStrongView = [[UIView alloc]initWithFrame:CGRectMake(25, 25, 50, 50)];
printf("self.selfStrongViewretain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfStrongView)));
打印結(jié)果是2 因為alloc init 會生成一個強引用 引用計數(shù)+1
self.selfStringView由于走了set方法 引用計數(shù)+1
[self.view addSubview:self.selfStrongView];
printf("self.selfStrongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfStrongView)));
打印結(jié)果是3 因為addSubview 內(nèi)部會把這個view添加到subviews數(shù)組里
@property(nonatomic,readonly,copy) NSArray<__kindof UIView *> *subviews;
這個數(shù)組是用copy修飾的疚宇,所以會生成一個強引用 引用計數(shù)+1
_strongView = [[UIView alloc]initWithFrame:CGRectMake(100, 100, 50, 50)];
printf("_strongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));
打印結(jié)果為1 因為_strongView不生成set方法 所以只有alloc init 生成的一個強引用 引用計數(shù)+1
[self.view addSubview:self.strongView];
printf("_strongView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_strongView)));
打印結(jié)果為2 原因同上一個addsubview
媽的重點來了淫茵,昨天研究這三行代碼百度一晚上
知識點 : 用weak修飾的 self.語法并不會使引用計數(shù)+1
UIView *selfView = [[UIView alloc]initWithFrame:CGRectMake(150, 150, 50, 50)];
self.selfWeakView = selfView;
printf("self.selfWeakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfWeakView)));
打印結(jié)果為2 上文中我們知道 selfView的引用計數(shù)為1 為什么把值付給self.WeakView 引用計數(shù)就為2了呢
當我們把__weak修飾的變量傳進NSLog方法中打印,這個方法需要持有這個變量咪奖,為了安全起見嘛辅鲸,如果不強引用一下,萬一還沒打印的被釋放了呢展箱?
所以會對selfView調(diào)用objc_loadWeakRetained, 這時候selfView的引用計數(shù)就會+1旨枯,在NSLog結(jié)束是,會調(diào)用objc_release, 然后引用計數(shù)-1混驰。
[self.view addSubview:self.selfWeakView];
printf("self.selfWeakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(self.selfWeakView)));
打印結(jié)果為3 因為addsubview
UIView *weaksView = [[UIView alloc]initWithFrame:CGRectMake(200, 200, 50, 50)];
printf("weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(weaksView)));
_weakView = weaksView;
printf("_weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));
[self.view addSubview:_weakView];
printf("_weakView retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(_weakView)));
打印結(jié)果分別為1 2 3 原因上邊兒都有