# 26、勿在分类中声明属性

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

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

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

```objectivec
@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分类"之外的其他分类中，可以定义存取方法，但尽量不要定义属性
