__strong 和 __weak
id obj1 = [[NSObject alloc] init]; 和 id __strong obj1 = [[NSObjectalloc] init];他俩是等价的
这里虽然没有显示的声明为__strong,但是Objective-C默认声明的一个对象就为__strong,
在强引用中,有时候会出现循环引用的情况,这时候需要弱引用__weak.强引用持有对象,弱引用不持有对象。
强引用可以释放对象,弱引用不可以,因为弱引用不持有对象,当弱引用指向一个强引用所持有的对象是,当强引用对象释放掉以后,弱引用会自动被赋值为nil,即弱引用会自动的指向nil。
举个例子:
#pragma mark ------强引用和弱引用-------
-(void)weakOrStrong{
id __weak obj0;
if(YES) {
idobj1 = [[NSObjectalloc]init];
obj0 = obj1;
NSLog(@"obj0: %@",obj0);
}
NSLog(@"obj0: %@",obj0);
}
运行结果如下:
NewCocoTest[2759:109430] obj0:
2017-02-20 13:58:58.331 NewCocoTest[2759:109430] obj0: (null)
因为obj1生成的默认的为强引用(__strong),在超出if的作用域之后,obj1所持有的对象被释放,
* obj0为弱引用,所以obj0不持有对象,在obj1对象释放后,obj0自动的被赋值为nil
* 弱引用的特性是,不持有对象,即便是写成id __weak obj1 = [[NSObject alloc] init];
* 此代码系统会给与警告,因为这里obj1被声明成弱引用,那么在赋值之后,alloc出来的对象会被立即释放。
//当产生的对象直接用弱引用来接手时,直接就释放掉了
#pragma mark ------强引用和弱引用-------
-(void)weakOrStrong{
id __weak obj0;
if(YES) {
id__weakobj1 = [[NSObjectalloc]init];//会出现警告
NSLog(@"obj1====%@",obj1);
obj0 = obj1;
NSLog(@"obj0: %@",obj0);
}
NSLog(@"obj0: %@",obj0);
}
//运行结果如下
NewCocoTest[2823:112254] obj1====(null)
2017-02-20 14:02:42.521 NewCocoTest[2823:112254] obj0: (null)
2017-02-20 14:02:42.522 NewCocoTest[2823:112254] obj0: (null)
网友评论