学习yykit 一些小小总结(学习雷锋好榜样)

网友投稿 444 2022-06-15


昨天看了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 @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 类型指针也是可以的

文/嘿晴天(简书作者)

原文链接:http://jianshu.com/p/911d737c6703


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:40条Android开发优化建议(android性能优化最佳实践)
下一篇:工具 | To-Do List,你选哪一款
相关文章

 发表评论

暂时没有评论,来抢沙发吧~