您的位置:首页 > Web前端

weak reference - 1

2015-05-30 16:02 148 查看
OC对象的Strong Reference和Weak Reference:

看到一篇文章提到__weak 参数的使用并直接上图:



上面提到被定义为__weak参数的weakName 会随着firstName内容指向的变更而自动set nil,而原来被指向的一块内存则自动被销毁。

嘿嘿,但是我非常信奉的一句话一个习惯,不要相信任何一本书!要相信编译器!编译器!编译器!重要的话总是说三遍,首先我就手打了一遍:



编译器结果是没有变化耶,嘻嘻,喜欢捣鼓才是真正的热爱,所以我继续深究下去。所以将每个内容变化前后的地址都输出(要记得,所以变量的操作和变化都基于指针,所以指针才是测变化的最标准的量)



这里发现了吧,赋予__weak参数的变量weakName 的内存地址是和变化前的firstName 地址相同:0x10fca6b40, 当firstName改变后指针指向了地址:0x10fca6ba0,然而被赋予__weak参数的变量还是指向的是0x10fca6b40,所以输出的仍是旧值,这里我想起了一个前辈说的,NSString和 @“ ”这种常量十分特殊(特殊在哪,日后必解决),不适于来测试此种关于地址的程序,例如内存的引用计数等,会有异常不到的结果。

嘿嘿-特殊终于解决,就是内存常量区不好处理,只要你用alloc手动创建就可以完美的测试,因为堆区好处理点(具体为什么,日后解决)



嘿嘿~ 终于解决了。 这验证了weak指针的作用(与强引用的区别),我心安多了 ~

所以那一句话实在重要!永远不要相信一句话,一本书,要相信编译器!!! 上面前辈的例子可不对哦。

-----

在学习Masonry框架的时候见识了一个弱引用的优雅写法(Masonry几乎都是用block实现),特地在这里记录下

#define WS(weakSelf)  __weak __typeof(&*self)weakSelf = self;


猛得一看,肯定让人觉得目瞪口呆的,觉得是什么,贴上用法:

WS(ws);

    UIView* sv = [UIView new];
    sv.backgroundColor = [UIColor blackColor];
    [self.view addSubview:sv];
    
    [sv mas_makeConstraints:^(MASConstraintMaker* make){
    
        make.center.equalTo(ws.view);
        make.size.mas_equalTo(CGSizeMake(300, 300));
    
    }];


看了上面的代码就很清楚了,就是将self 添加__weak属性 成ws (weak self)

我们将这个宏逐个拆看分析:难点就集中在了__typeof(&*self) 这一部分:

__typeof关键字到底是什么鬼呢?日后再搞吧!

待续...

感谢参考文章:
http://blog.csdn.net/q199109106q/article/details/8565017 http://mobile.51cto.com/iphone-313122.htm
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: