1.除了主分类,其他分类中声明的属性不会生成实质的成员变量,只会生成对应的setter和getter方法。
@interface Person (YXInfo)
@property (nonatomic,copy) NSString *name;
@end
@implementation Person (YXInfo)
- (NSString *)name{
//return _name; //use of undeclared identifier '_name'
return nil;
}
- (void)setName:(NSString *)name{
//_name = name; // //use of undeclared identifier '_name'
}
@end
2.那么就没有办法在分类中为类加上一个成员变量?Runtime!
通过(十) [OC高效系列]在既有类中使用关联对象存放自定义数据这篇博文上说的这种形式。
比如:
@interface Person (YXInfo)
@property (nonatomic,copy) NSString *name;
@end
static char kyxName;
@implementation Person (YXInfo)
- (NSString *)name{
return objc_getAssociatedObject(self, &kyxName);
}
- (void)setName:(NSString *)name{
objc_setAssociatedObject(self, &kyxName, name, OBJC_ASSOCIATION_COPY);
}
@end
但是这样的形式,虽然可行,书中并不推荐,因为要保持属性声明中的内存管理的语义与runtime中传入的语义参数保持一致。
可以定义存取方法,但是不要使用属性。
3.有些只读属性还是可以在分类中使用的