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