Objective-C学习—category与associative
category与associative作为objective-c的扩展机制的两个特性,category即类型,可以通过它来扩展方法;associative,可以通过它来扩展属性;在iOS开发中,可能category比较常见,相对的associative,就用的比较少,要用它必须使用<objc/runtime.h>的头文件,然后就可以自由使用objc_getAssociatedObject以及objc_setAssociatedObject。
category不用多说,associative有一点需要注意:
断开关联是使用objc_setAssociatedObject函数,传入nil值即可。
接着列表7-1中的程序,我们可以使用如下的代码来断开字符串overview和arry之间的关联:
objc_setAssociatedObject(array, &overviewKey, nil, OBJC_ASSOCIATION_ASSIGN);
其中,被关联的对象为nil,此时关联策略也就无关紧要了。
使用函数objc_removeAssociatedObjects可以断开所有关联。通常情况下不建议使用这个函数,因为它会断开所有关联。只有在需要把对象恢复到“原始状态”的时候才会使用这个函数。
category与associative结合
在category的.h中
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;
1 UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect]; 2 button.test = @"test";
参考:http://hi.baidu.com/utfnjhuvkdeoqrr/item/f1bac8d8879b163021e25075

浙公网安备 33010602011771号