相信大家在调用系统的类时会需要用到增加实例变量的需要,那么这里讲一下AssociatedObject(关联对象)的用法:
objc_setAssociatedObject和objc_getAssociatedObject,简单明了的一个理解:关联是指把两个对象相互关联起来,使得其中的一个对象作为另外一个对象的一部分。关联特性只有在MacOSXV10.6以及以后的版本上才是可用的。在类的定义之外为类增加额外的存储空间使用关联,我们可以不用修改类的定义而为其对象增加存储空间。这在我们无法访问到类的源码的时候但是又想为它增加实例变量的时候会用到他们。
可能会有人认为我可以用继承来实现,确实继承可以完成这个任务。但是通常我们在团队开发中很少会用到继承,关于这一点本篇不阐述了。那么又有要说可以利用category来增加实例变量,嗯,不错,我完成了新增的实例变量的增加。结果发现,在运行过程我get或set该实例变量的时候却crash了,为什么呢?看下面:
这里我为UIButton新建了一个category,添加了identifer这个实例变量
却发现提示了,需要实现identifer的get和set方法,那么,我们能不能使用@synthesize 在Category的实现里生成get 和 set 方法呢?
语法提示无法静态的创建他拉get和set方法,那么这如何是好?
要知道OC可是一个运行时系统,静态不行,我们能否动态呢?回答是完全可以的,下面我们来看:
既然是动态来实现,那么就需要用到objc/runtime.h,我们导入头文件,利用AssociatedObject(关联对象)实现如下:
这里就大功告成了,关于objc_setAssociatedObject和objc_getAssociatedObject的参数大家就查一下帮助即可。
上述的写法是可以复用的,如果不需要复用的话,更为简便的写法:
是不是这样写起来更为简便呢?
综上所述,以后我们在开发的过程中碰到想为系统的类增加实例变量时,可以灵活运用AssociatedObject将会无往而不利。
网友评论