1. 程式人生 > >OC執行時簡單運用(2)

OC執行時簡單運用(2)

在開發過程中,如果經常會遇到想要給現有的類(閉源類)新增自己的方法或者屬性,但是繼承又會顯得麻煩和臃腫,但是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:需要繫結屬性的類物件

constvoid *key: 該屬性對應的唯一標誌字串,可以師C語言的字常量符串型別,也可是OC中的字串物件型別。

id value:該屬性對應的值

objc_AssociationPolicy policy:關聯型別(涉及記憶體管理,跟記憶體管理的語義特性相似),點選檢視具體的意義

與存入方法對應的是取出的方法

id objc_getAssociatedObject(id object, const void *key)

id object:被繫結屬性的物件

constvoid *key :屬性對應的標誌符號(唯一)

存取的過程如下:


(2)假設需要給UIAlerView新增一個回撥的block

1.建立UIAlertView的category,取名為Block,宣告方法

- (void)showAlertViewWithCompleteBlock:(AlertViewCompleteBlock)block:


2.通過void objc_setAssociatedObject(

id object, constvoid *key, id value, objc_AssociationPolicypolicy) 和id objc_getAssociatedObject(id object, constvoid *key)結合使用實現方法:


為已有類增加屬性和方法主要是通過void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicypolicy) 和id objc_getAssociatedObject(id object, const void *key)兩個方法結合來實現值傳遞過程中的儲存操作。