OC运行时简单运用(2)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/WangErice/article/details/50802337

在开发过程中,如果经常会遇到想要给现有的类(闭源类)添加自己的方法或者属性,但是继承又会显得麻烦和臃肿,但是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 :属性对应的标志符号(唯一)

存取的过程如下:


(2)假设需要给UIAlerView添加一个回调的block

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)两个方法结合来实现值传递过程中的存储操作。

demo下载链接


猜你喜欢

转载自blog.csdn.net/WangErice/article/details/50802337