原文资料,看了上述文章,写一点自己的感受。
首先看一下函数名字,类_设置关联的类,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。望看到我这篇文章的同学解答一下。
除非注明,文章均为seanward原创,转载请注明本文地址:https://www.jianshu.com/p/5ecce30afc72