(二十五)[OC高效系列]勿在分类中声明属性

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.有些只读属性还是可以在分类中使用的

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,080评论 19 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,898评论 25 709
  • 重点掌握 3 类对象和方法 对象就是一个物体 类的独特存在就是一个实例,对实例进行操作叫做方法。方法可以应用于类或...
    Coder大雄阅读 1,287评论 0 2
  • 想念 是漫长的等待 是甜蜜的负担 相思 是致命的煎熬 是必要的春药 相爱 是爱侣的天堂 是最美的鸳鸯
    妖媚儿阅读 202评论 0 1
  • 竹影轩阅读 246评论 0 0