学习yykit 一些小小总结

昨天看了yykit 注意到有一段给category 动态添加属性的宏,也没深入研究,今天来仔细看看

#ifndef YYSYNTH_DYNAMIC_PROPERTY_OBJECT
#define YYSYNTH_DYNAMIC_PROPERTY_OBJECT(_getter_, _setter_, _association_, _type_) \
- (void)_setter_ : (_type_)object { \
    [self willChangeValueForKey:@#_getter_]; \
    objc_setAssociatedObject(self, _cmd, object, OBJC_ASSOCIATION_ ## _association_); \
    [self didChangeValueForKey:@#_getter_]; \
} \
- (_type_)_getter_ { \
    return objc_getAssociatedObject(self, @selector(_setter_:)); \
}
#endif

他调用的方式是这样的

//调用的方法
     @interface NSObject (MyAdd)
     @property (nonatomic, retain) UIColor *myColor;
     @end

     #import <objc/runtime.h>
     @implementation NSObject (MyAdd)
     YYSYNTH_DYNAMIC_PROPERTY_OBJECT(myColor, setMyColor, RETAIN, UIColor *)
     @end

看了上面一段宏定义 和 调用,大家应该还是不太了解为什么那段宏定义就可以实现动态给category 添加属性。
先普及一点宏定义 的关键字 一个# 表示要替换变量 ,两个 ##要拼接字符串 ,\表示多行 _cmd 是iOS 是一种特定宏 ,表示本地方法, 在这里表示 @selector(setter:)
好的,接下来,新建一个project 来模仿这个案例,也即是如何给category 动态添加属性,其实这里关键是是用到了 runtime 的动态关联,使用Associate 建立关联动态添加属性
如果将宏定义转换成代码将会这么写呢

-(void)setMyColor:(UIColor *)myColor
{
    [self willChangeValueForKey:@"myColor"];//kvo 机制即将修改变量发送通知
    //1 源对象
    //2 关键字 唯一静态变量key associatedkey
    //3 关联的对象 sender
    //4 关键策略  OBJC_ASSOCIATION_RETAIN_NONATOMIC
    objc_setAssociatedObject(self, @selector(setMyColor:), myColor, OBJC_ASSOCIATION_RETAIN);
    //
    [self didChangeValueForKey:@"myColor"];//kvo 机制已修改变量发送通知
}
-(UIColor *)myColor
{
    return objc_getAssociatedObject(self, @selector(setMyColor:));
}

估计到最后应该还会有这么一个问题,为什么注释2 关键字写成了这种@selector(setMyColor:) 这种形式了,其实关键字是一个void类型的指针。每一个关联的关键字必须是唯一的。通常都是会采用静态变量来作为关键字。所以这里用@selector(setMyColor:)获取void 类型指针也是可以的
代码已经上传到了https://github.com/heysunnyboy/categoryDemo 如果众大神发现有什么,写的不对的,可以加qq互相交流下,

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,800评论 0 9
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,697评论 33 466
  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 13,844评论 6 13
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,896评论 25 709
  • 原来你还在这里。 这是我想对自己说的话。 总会说,勿忘初衷,方得始终。 然而什么是初衷呢? 是一朝被蛇咬 十年怕草...
    木易力口阅读 2,976评论 0 0