美文网首页
强引用和弱引用

强引用和弱引用

作者: 俊俊吖 | 来源:发表于2017-02-20 14:05 被阅读0次

    __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)

    相关文章

      网友评论

          本文标题:强引用和弱引用

          本文链接:https://www.haomeiwen.com/subject/ehfewttx.html