在开发过程中,如果经常会遇到想要给现有的类(闭源类)添加自己的方法或者属性,但是继承又会显得麻烦和臃肿,但是category又不支持,这时候我们就可以利用运行时的特性来解决这一问题。
(1)假设我们要给UIButton添加一个枚举值属性style,该属性控制button是否具有圆角。
1.首先我们为button创建一个category,取名为style,声明枚举类型属性style,然后发现如下警告:
这也就我们通常情况下所说的不能直接通过category为已有类添加属性,category也不会生成对应的_style和方法;
2.手动实现setter和getter方法;
3.通过runtime.h 中的
void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy)
实现属性和类对象的绑定,其中参数的意义如下:
id object:需要绑定属性的类对象
const void *key: 该属性对应的唯一标志字符串,可以师C语言的字常量符串类型,也可是OC中的字符串对象类型。
id value:该属性对应的值
objc_AssociationPolicy policy:关联类型(涉及内存管理,跟内存管理的语义特性相似),点击查看具体的意义
与存入方法对应的是取出的方法
id objc_getAssociatedObject(id object, const void *key)
id object:被绑定属性的对象
const void *key :属性对应的标志符号(唯一)
存取的过程如下:
1.创建UIAlertView的category,取名为Block,声明方法
- (void)showAlertViewWithCompleteBlock:(AlertViewCompleteBlock)block:
2.通过void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicypolicy) 和id objc_getAssociatedObject(id object, const void *key)结合使用实现方法:
为已有类增加属性和方法主要是通过void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicypolicy) 和id objc_getAssociatedObject(id object, const void *key)两个方法结合来实现值传递过程中的存储操作。