zoukankan      html  css  js  c++  java
  • [ios] strong和weak

    自从有了ARC,就可以使用weak或strong来说明属性是弱引用还是强引用;

    strong关键字与retain关似,用了它,引用计数自动+1,用实例更能说明一切
     
        1.    @property (nonatomic, strong) NSString *string1;   
        2.    @property (nonatomic, strong) NSString *string2;  
     
    有这样两个属性,
     
        1.    @synthesize string1;   
        2.    @synthesize string2;  
     
     
    猜一下下面代码将输出什么结果?
     
        1.    self.string1 = @"String 1";   
        2.    self.string2 = self.string1;   
        3.    self.string1 = nil;  
        4.    NSLog(@"String 2 = %@", self.string2);  
     
     
    结果是:String 2 = String 1
     
    由于string2是strong定义的属性,所以引用计数+1,使得它们所指向的值都是@"String 1", 如果你对retain熟悉的话,这理解并不难。
     
    接着我们来看weak关键字:
    如果这样声明两个属性:
     
        1.    @property (nonatomic, strong) NSString *string1;   
        2.    @property (nonatomic, weak) NSString *string2;  
     
    并定义
     
     
        1.    @synthesize string1;   
        2.    @synthesize string2;  
     
    再来猜一下,下面输出是什么?
     
     
        1.    self.string1 = [[NSString alloc] initWithUTF8String:"string 1"];   
        2.    self.string2 = self.string1;   
        3.    self.string1 = nil;  
        4.    NSLog(@"String 2 = %@", self.string2);  
     
    结果是:String 2 = null
     
    分析一下,由于self.string1与self.string2指向同一地址,且string2没有retain内存地址,而 self.string1=nil释放了内存,所以string1为nil。声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为 nil。这样的好处能有效的防止野指针。在c/c++开发过程中,为何大牛都说指针的空间释放了后,都要将指针赋为NULL. 在这儿用weak关键字帮我们做了这一步。
     

    可能有个例子形容是妥当的。

    想象我们的对象是一条狗,狗想要跑掉(被释放)。

    strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。

    weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。

    只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。

  • 相关阅读:
    centos 用户管理
    rsync 实验
    文件共享和传输
    PAT 1109 Group Photo
    PAT 1108 Finding Average
    PAT 1107 Social Clusters
    PAT 1106 Lowest Price in Supply Chain
    PAT 1105 Spiral Matrix
    PAT 1104 Sum of Number Segments
    PAT 1103 Integer Factorization
  • 原文地址:https://www.cnblogs.com/jinjiantong/p/2984436.html
Copyright © 2011-2022 走看看