美文网首页
强引用(__strong)和 弱引用(__weak)

强引用(__strong)和 弱引用(__weak)

作者: iOS_Mario | 来源:发表于2016-05-12 16:33 被阅读0次

    在Objective-C的ARC模式中,

    id obj1 = [[NSObject alloc] init];

    这里虽然没有显示的声明为__strong,但是Objective-C默认声明的一个对象就为__strong,即:

    id obj1 = [[NSObject alloc] init];

    id __strong obj1 = [[NSObject alloc] init];

    是等价的。

    在强引用中,有时会出现循环引用的情况,这时就需要弱引用来帮忙(__weak)。

    强引用持有对象,弱引用不持有对象。强引用可以释放对象,但弱引用不可以,因为弱引用不持有对象,当弱引用指向一个强引用所持有的对象时,当强引用将对象释放掉后,弱引用会自动的被赋值为nil,即弱引用会自动的指向nil。

    下面用代码来说明:

    //

    //  main.m

    //  study

    //

    //  Created by maao on 16/5/12.

    //  Copyright © 2016年 maao. All rights reserved.

    #import<Foundation/Foundation.h>

    int main(int argc, char * argv[]) {

                     @autoreleasepool {            

                           id __weak obj0 = nil;            

                            if (YES) {                 

                                 id obj1 = [[NSObject alloc] init];                  

                                 obj0 = obj1;                  

                                 NSLog(@"obj0: %@", obj0);            

                             }            

                        NSLog(@"obj0: %@", obj0);   

                        }    

              return 0;

    }

    /*

    *  输出结果

    *  obj0:<NSObject:0x1003066c0>

    *  obj0: (null)

    *

    *  因为obj1生成的默认的为强引用(__strong),在超出if的作用域之后,obj1所持有的对象被释放,

    *  obj0为弱引用,所以obj0不持有对象,在obj1对象释放后,obj0自动的被赋值为nil

    *  弱引用的特性是,不持有对象,即便是写成id __weak obj1 = [[NSObject alloc] init];

    *  此代码系统会给与警告,因为这里obj1被声明成弱引用,那么在赋值之后,alloc出来的对象会被立即释放。

    */

    相关文章

      网友评论

          本文标题:强引用(__strong)和 弱引用(__weak)

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