Objective-C之Category

来源:互联网 发布:接收chinanet的软件 编辑:程序博客网 时间:2024/05/17 08:40
Category的主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法。在 Objective-C 中的具体体现为:实例(类)方法、属性和协议。

使用场景
  1. 给现有的类添加方法;
  2. 将一个类的实现拆分成多个独立的源文件;
  3. 声明私有的方法。

注意事项:
    1.不能覆写原有类的方法
    原因:将分类方法加入类中是在运行期系统加载分类时完成的。运行期系统把分类中所实现的每个方法都加入类的方法列表中。如果类中本来就有此方法,而分类又实现了一次,那么分类会覆盖原来那一份实现代码。

    2.在分类中添加属性,要自己实现存取方法setter和getter
    原因:分类中无法新增实例变量,因此编译器无法通过属性把实例变量所需的存取方法生成出来。这时,需要我们在分类中为属性实现存取方法。此时可以把存取方法声明为@dynamic,也就是说,这些方法等到运行期再提供。

    可以通过关联对象来实现属性存取方法,使用运行时的这两个方法管理关联对象:

    void objc_setAssociatedObject(id object, const void *key, id value, objc_AssociationPolicy policy);

    id objc_getAssociatedObject(id object, const void *key);

把属性关联到分类中,属性通过“键”来区分。存储属性值的时候,可以指明“存储策略”,用以维护相应的“内存管理语义”。存储策略由名为objc_AssociationPolicy的枚举所定义。这些值跟属性定义中的nonatomic,copy,retain等关键字的功能类似。





实例
下面是一个属性自定义getter和setter的例子:

@interfaceEOCPerson (FriendShip)
@property (nonatomic,strong)NSArray *friends;
@end

static const char *kFriendPropertyKey = "kFriendsPropertyKey";
@implementationEOCPerson (FriendShip)
- (
NSArray*) friends {
   
return objc_getAssociatedObject(self,kFriendPropertyKey);
}

- (
void)sefFriends:(NSArray*)friends {
   
objc_setAssociatedObject(self,kFriendPropertyKey, friends,OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
@end
可以看出使用objc_setAssociatedObject和objc_getAssociatedObject函数可以很方便的实现属性的getter和setter。 
0 0