objc_setAssociatedObject相关学习

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

首先看一下函数名字,类_设置关联的类,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.左侧调用栈有可能不一样


objc_setAssociatedObject相关学习_第1张图片
左侧栈

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

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,有截图证明:

objc_setAssociatedObject相关学习_第2张图片
没有Crash

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


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

你可能感兴趣的:(objc_setAssociatedObject相关学习)