26、勿在分类中声明属性

虽然说我们可以在分类中运用runtime实现关联对象的方式,实现属性(实现方式之前这篇文章@dynamic部分有写)。但是这么做不理想。要把相似的代码写很多边,而且在内存管理问题上容易出错(如:当修改了某个属性的特质attrubute时,还要记得修改setter方法中设置关联对象时所用的内存管理语义)。

​ 分类的目标在于扩展类的功能,而非封装数据。

​ 但有时候只读属性还是可以在分类中使用的。如:为NSCalendar类创建分类,返回各个月份名称数组。虽说仅是访问数据不需要实例变量来实现。但此时最好不要用属性,用一个方法就好。因为属性表达的意思是:类中有数据在支持着它。

@interface NSCalendar (XXX_Additions)
- (NSArray *)xxx_allMothns;
@end
@implementation NSCalendar (XXX_Additions)
- (NSArray *)xxx_allMothns {
  if ([self.calendar isEqualToString:NSGegorianCalendar]) {
    return @[@"January", @"February", ...];
  } else if (/* other calendar identifiers */) {
    /* return months for other calendars */
  }
}
@end

要点:

  • 把封装数据所用的全部属性都定义在主接口里

  • 在"class-continuation分类"之外的其他分类中,可以定义存取方法,但尽量不要定义属性

Last updated

Was this helpful?