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