category與associative做爲objective-c的擴展機制的兩個特性,category即類型,能夠經過它來擴展方法;associative,能夠經過它來擴展屬性;在iOS開發中,可能category比較常見,相對的associative,就用的比較少,要用它必須使用<objc/runtime.h>的頭文件,而後就能夠自由使用objc_getAssociatedObject以及objc_setAssociatedObject。objective-c
category不用多說,associative有一點須要注意:函數
斷開關聯是使用objc_setAssociatedObject函數,傳入nil值便可。atom
接着列表7-1中的程序,咱們能夠使用以下的代碼來斷開字符串overview和arry之間的關聯:spa
objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN); code
其中,被關聯的對象爲nil,此時關聯策略也就可有可無了。
使用函數objc_removeAssociatedObjects能夠斷開全部關聯。一般狀況下不建議使用這個函數,由於它會斷開全部關聯。只有在須要把對象恢復到「原始狀態」的時候纔會使用這個函數。對象
category與associative結合blog
在category的.h中ci
1 #import <UIKit/UIKit.h> 2 #import <objc/runtime.h> 3 @interface UIView (Extension) 4 5 @property (nonatomic,strong) NSString *test;
而後在相應的.m文件實現它的getter,setter方法開發
1 -(void)setTest:(NSString *)test 2 { 3 // "test"爲(const void *)字符串 4 objc_setAssociatedObject(self, "test", test, OBJC_ASSOCIATION_RETAIN); 5 } 6 7 -(NSString *)test 8 { 9 return objc_getAssociatedObject(self, "test"); 10 }
只須要以下調用就能夠了:這樣就至關於給UIView加了一個屬性test;rem
1 UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 2 button.test = @"test";
參考:http://hi.baidu.com/utfnjhuvkdeoqrr/item/f1bac8d8879b163021e25075