OC的category是一个非常好用的特性,它允许你在不改变源码的情况下扩展类的一些功能特性,从而能更好地组织你地代码。
但是使用category有一个很大地限制,不能在category里添加成员变量,
但是使用category有一个很大地限制,不能在category里添加成员变量,
![](https://i-blog.csdnimg.cn/blog_migrate/4b4b7184aa820256e1f2e54f04b010d1.png)
这个限制较大地限制了category的使用,当然使用extension可以往类里面添加成员变量,但是extension要求你需要在original class 的实现类里面实现extension所添加的方法。所以extension不可能对拿不到源码的框架进行扩展。
对于category不能添加成员变量的限制,下面我们介绍一个很巧妙的方法来解决:使用runtime库的objc_setAssociatedObject / objc_getAssociatedObject 函数来解决。
objc_setAssociatedObject 的定义:
对于category不能添加成员变量的限制,下面我们介绍一个很巧妙的方法来解决:使用runtime库的objc_setAssociatedObject / objc_getAssociatedObject 函数来解决。
objc_setAssociatedObject 的定义:
![](https://i-blog.csdnimg.cn/blog_migrate/28fa630e49237c445d33d59fd8df6fb5.png)
objc_getAssociatedObject 的定义:
![](https://i-blog.csdnimg.cn/blog_migrate/b6d37033a0183d10cd2c06e3fcfeac05.png)
可以看出objc_setAssociatedObject 就是将一个对象跟另一个对象进行关联,并用一个key来标示,objc_getAssociatedObject 就是用这个key来拿到与receiver相关联的一个对象。
objc_setAssociatedObject / objc_getAssociatedObject 来在category里添加成员变量非常简单,请看下面的一个简单的例子:
objc_setAssociatedObject / objc_getAssociatedObject 来在category里添加成员变量非常简单,请看下面的一个简单的例子:
![](https://i-blog.csdnimg.cn/blog_migrate/09f767c223b3aa1519eca2a58fca5a75.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5d37e2b9e270e5b3f12c9e0e4e6689d8.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6fee389c2edc383b16ea042ff36c3132.png)
注意:必须使用@dynamic来让编译器知道我们自己实现setter/getter方法
不能使用@synthesize(也不能@dynamic 和@synthesize都不写,什么都不写在最新的xcode里是默认@synthesize),@synthesize会自动生成成员变量,并自动生成setter/getter方法。
最后,objc_setAssociatedObject 的关联的policy 可以根据自己的需求使用,这个例子使用OBJC_ASSOCIATION_RETAIN_NONATOMIC来标示一个strong reference来指向被关联的对象。
不能使用@synthesize(也不能@dynamic 和@synthesize都不写,什么都不写在最新的xcode里是默认@synthesize),@synthesize会自动生成成员变量,并自动生成setter/getter方法。
最后,objc_setAssociatedObject 的关联的policy 可以根据自己的需求使用,这个例子使用OBJC_ASSOCIATION_RETAIN_NONATOMIC来标示一个strong reference来指向被关联的对象。