_cmd 与 runtime 的结合

2019/7/15 posted in  iOS

只有运行时给分类添加属性,大部分都是这样的

- (NSString *)customName {
     return objc_getAssociatedObject(self, &kExtendVarKey);
   }
- (void)setCustomName:(NSString *)customName {
    objc_setAssociatedObject(self, &kExtendVarKey,, customDelegate, OBJC_ASSOCIATION_RETAIN_COPY);
 }

_cmd 是隐藏的参数,表示当前方法的selector,另外隐藏参数self表示当前方法调用的对象实例。
这个参数是唯一的参数,在一个文件中方法名不会重复。
所以可以让它代替运行时当中的属性的键名。

- (NSString *)customName {
     return objc_getAssociatedObject(self, _cmd);
   }
- (void)setCustomName:(NSString *)customName {
    objc_setAssociatedObject(self, @selector(customName), customName, OBJC_ASSOCIATION_RETAIN_COPY);
  }