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 :屬性對應的標誌符號(唯一)
存取的過程如下:
1.建立UIAlertView的category,取名為Block,宣告方法
- (void)showAlertViewWithCompleteBlock:(AlertViewCompleteBlock)block:
2.通過void objc_setAssociatedObject(
為已有類增加屬性和方法主要是通過void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicypolicy) 和id objc_getAssociatedObject(id object, const void *key)兩個方法結合來實現值傳遞過程中的儲存操作。