您的当前位置:首页正文

在category 中如何使用 @property?

来源:华佗小知识

category 中使用 @property

在 IOS 开发中,可以使用 category 为已有的类添加方法,但是并不能在 category 中为已有类添加实例变量和存取方法。
在 category 中使用 @property只会生成 setter 和 getter 方法的声明,Xcode 警告需要手动实现 setter 和 getter 方法。

使用关联对象为已经存在的类中添加属性

在 category 中增加属性的目的主要为了解耦,简化框架调用,在很多第三方框架中会使用。在分类中 @property 并不会自动生成实例变量以及存取方法,所以一般使用关联对象为已经存在的类添加『属性』。关联对象类似于成员变量,不过是在运行时添加的。

关联对象的使用方法

我们可以把关联对象想象成一个Objective-C对象(如字典),这个对象通过给定的key连接到类的一个实例上。不过由于使用的是C接口,所以key是一个void指针(const void *)。我们还需要指定一个内存管理策略,以告诉Runtime如何管理这个对象的内存。

代码示例

#import "People.h"

@interface People (eat) 
//在分类中定义属性
@property (nonatomic,copy) NSString *eatTimes;

@end
#import "People+eat.h"
#import <objc/runtime.h>
//标记属性的 key
static char eatKey;
@implementation People (eat)
//setter
- (void)setEatTimes:(NSString *)eatTimes {
    objc_setAssociatedObject(self, &eatKey, eatTimes, OBJC_ASSOCIATION_COPY);
}
//getter
- (NSString *)eatTimes {
    return objc_getAssociatedObject(self, &eatKey);
}
@end