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

posted @ 2013-09-22 13:52  天下.无贼  阅读(201)  评论(0)    收藏  举报