Runtime - 关联对象使用方法及注意点
大家都知道在分类里,可以间接的添加属性,运用runtime关联对象。
如下图,只是声明了btnClickedCount的set, get方法而已
并没有生成_btnClickedCount 成员变量,以及set,get方法的实现。
有人会自己添加_btnClickedCount 成员变量,但编译一下,编译器就马上报错
所以给分类间接添加属性,只能用用runtime 关联对象方法
图中”btnClickedCount”为key值,从runtime.h api里看出
此处说明的是key,只要是内存地址(唯一)就可以,用双引号的写法,是比较易读,但不足之处,没有报错机制,即使少写了一个字母,也不知道。
会有人用方法来当key值,相应的get方法如下(set方法不写了)
这里推荐的写法用@selector()当key值,好处是唯一,并且写错了会有报错,
那么问题来了,要选择什么@selector()方法当key值,直接用get方法
用get方法当作key值的好处,还有另外一个,是在get方法里,key值可以用_cmd代替
本质:原因是每个方法都有两个隐式参数self和_cmd,_cmd就是当前方法名。每个方法都把消息接收对象称作self,而自身的选择器称_cmd
转成底层C++代码后,即可看出。
注意:set方法的key值,就不能用_cmd,因为set方法里的_cmd是@selector(setBtnClickedCount),这样就和get方法里的key值不一样,所以set方法的key值依然用@selector(btnClickedCount)