runtime - iOS 中 分类关联实例属性的写法有点疑问?

 飞翔的小鸟52588 发布于 2022-10-27 21:39
- (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(当前方法) 完全一样嘛?不一样,有什么区别?

3 个回答
  • _cmd只能获取当前方法的名字,如果在set里面也用_cmd获取的就是“ setAssociatedObject_copy”。

    2022-10-29 04:51 回答
  • 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;
    
    2022-10-29 04:51 回答
  • 因为绑定同一个属性setter和getter肯定用的是同一个key,但是用_cmd只能获取当前的方法名,所以你在set方法里面肯定要或获取跟上面相同的key, _cmd也是SEL类型的参数和@selector(xxx)一样

    2022-10-29 04:53 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有