美文网首页iOS Developer征服iOS
objc_setAssociatedObject相关学习

objc_setAssociatedObject相关学习

作者: seanward | 来源:发表于2016-06-15 18:08 被阅读1901次

    原文资料,看了上述文章,写一点自己的感受。

    首先看一下函数名字,类_设置关联的类,Associated,字典查一下:adj. 关联的;联合的。同理,objc_getAssociatedObject,objc_removeAssociatedObjects意思都明白了,remove的类是所有,所以最后用了s。

    注意:

    博主是采用navVC推出VC的,所以后续才会有那样子的事情发生,如果你单纯的设置一个VC,是不会发生接下去博主说的事情的,不信你试试。

    设置三个观察的话,只能命中一个,那就是watchpoint set v string_weak_assign。

    实验

    我们先在 viewDidLoad 方法的第 28 行打上断点,然后运行程序,点击导航栏右上角的按钮 Push 到 ViewController 界面,程序将停在断点处。

    1.key值的第三种写法:

    定义的一个变量

    @property(nonatomic,strong) UIView *sh_alphaView;

    然后写好setter和getter方法

    -(void)setSh_alphaView:(UIView *)sh_alphaView{

    objc_setAssociatedObject(self, @selector(sh_alphaView), sh_alphaView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

    }

    -(UIView *)sh_alphaView{

    UIView *v = objc_getAssociatedObject(self, _cmd);

    return v;

    }

    @selector(sh_alphaView)和_cmd都是拿来当做key了,并且值是一样的。

    2.左侧调用栈有可能不一样

    左侧栈

    点击上图红色可以切换的。

    3.学习一下watchpoint:

    你设置了一个watchpoint,就表明你告诉IDE你希望监视一块内存。当被监视的内存的内容发生变化时,watchpoint就被触发了,此时程序暂停运行,等待我们查看。

    文章中可以看见博主在lldb中输入的命令是watchpoint set v string_weak_assign,其实全称应该是watchpoint set variable string_weak_assign,也就是字面意思咯。

    4.根据楼主的代码,我遇到一个问题,望大家解答

    我打开了下面的注释,在点击self.view的时候,触发了touchesBegan:方法,

    NSLog(@"self.associatedObject_assign: %@", self.associatedObject_assign); // Will Crash

    但是没有Crash,有截图证明:

    没有Crash

    代码的话我都是复制文章上面的,但情况是:有时候Crash,有时候没有Crash。望看到我这篇文章的同学解答一下。

    除非注明,文章均为seanward原创,转载请注明本文地址:https://www.jianshu.com/p/5ecce30afc72

    相关文章

      网友评论

        本文标题:objc_setAssociatedObject相关学习

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