美文网首页
(七)weak 关键字

(七)weak 关键字

作者: 叔叔不吃棒棒糖 | 来源:发表于2017-06-29 15:53 被阅读24次

    前言

    weak弱引用,前面提到了,没有深入写,参考iOS深入学习之Weak关键字介绍这篇文章写一点,对于文章的后半部分weak如何置为nil,在以后在补充吧。

    正文

    weak代表弱引用,特点是不决定对象内存释放。
    直接上代码吧

    @property (nonatomic,strong)id strongPoint;
    @property (nonatomic,weak)id weakPoint;
    
    self.strongPoint = [UILabel new];
    self.weakPoint = self.strongPoint;
    self.strongPoint = nil;
    NSLog(@"result is :%@", self.weakPoint);
    //打印
    textview[5766:1480577] result is :(null)
    

    strongPoint是强引用的指针,此处两个指针同时指向一个对象,当strongPoint不再指向对象时,对象内存释放,weakPoint指向nil,但是如果wakPoint也是强引用就会打印如下

    textview[5794:1482166] result is :<UILabel: 0x7ffab2511a70; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x608000282c60>>
    

    因为对象还有强指针指向,所以不会释放

    那么一个奇怪的事情就会发生了

    @property (nonatomic,strong)id strongPoint;
    @property (nonatomic,weak)id weakPoint;
    
    self.strongPoint = [NSString stringWithFormat:@"notStrong"];
    self.weakPoint = self.strongPoint;
    self.strongPoint = nil;
    NSLog(@"result is :%@", self.weakPoint);
    //打印
    textview[5814:1483779] result is :notStrong
    

    设置为NSString之后,即使被释放了,也能不打印nil。
    原因呢可以看一下这篇文章被__weak修饰的NSString
    我就直接写结论了(@""、initWithString、stringWithFormat)声明时它是常量字符串,没有retainCount(引用计数),没有强指针指向它,存在内存静态区,不会被销毁,输出自然会有结果。
    (initWithFormat)声明不是常量字符串。

    相关文章

      网友评论

          本文标题:(七)weak 关键字

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