runtime - iOS 中 分类关联实例属性的写法有点疑问?
PHP中文网
PHP中文网 2017-04-18 09:52:09
0
3
679
- (NSString *)associatedObject_copy {
    return objc_getAssociatedObject(self, _cmd);
}

- (void)setAssociatedObject_copy:(NSString *)associatedObject_copy {
    objc_setAssociatedObject(self, @selector(associatedObject_copy), associatedObject_copy, OBJC_ASSOCIATION_COPY_NONATOMIC);
}

上面这段代码中, _cmdself 类似,只不过前者表示的是当前的SEL
第二个方法的第二个参数为什么不也用_cmd呢?我理解的 _cmd@selector(当前方法)不是一个意思吗?
为什么第一个方法的第二个参数用_cmd,第二个方法的第二个参数却用@selector(xxx)了啊?
希望能告知一二.....

啰嗦这么多:

其实我的问题主要是 在同一个方法里面,_cmd@selector(当前方法) 完全一样嘛?不一样,有什么区别?

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(3)
Peter_Zhu

因為綁定同一個屬性setter和getter肯定用的是同一個key,但是用_cmd只能获取当前的方法名,所以你在set方法里面肯定要或获取跟上面相同的key, _cmd也是SEL类型的参数和@selector(xxx)一樣

左手右手慢动作

objc_getAssociatedObject 和 objc_setAssociatedObject的第二個參數都是一個key而已

id objc_getAssociatedObject(id object, const void *key);

當然可以用@selector()來當參數,其本質也是一個常數id,你上邊的也說了你的_cmd也是一個SEL,按道理你的objc_setAssociatedObject的第二個參數應該是_cmd才對,一般用法如下定義:


static const void *YourKeyName  = &YourKeyName;
阿神

_cmd只能取得目前方法的名字,如果在set裡面也用_cmd取得的就是「 setAssociatedObject_copy」。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板