Category 与 Extension

Category(分类)

我们为什么要用Category

当我们需要为已知的类添加方法的时候,我们就可以考虑使用Category。有人就会问,为什么我们不直接在这个类中添加方法,或者继承这个类在子类中添加方法?
首先,不直接在这个类中添加方法的原因,一种情况是我们可能没有办法直接修改这个类的文件,例如给NSArray添加一个方法,我们只能写一个Category。还有就是如果我们修改了这个类的方法,那么他的子类也都会受到影响,所以这并不是一个好的做法

再说继承,我们加了这个方法之后,这个类从设计上讲还是这个类,而不是他的子类,所以继承并不是很合理

如何写一个Category

  • Objective-C
@interface NSObject (Category)

- (void)myMethod;

@end

@implement NSObject (Category)

- (void)myMethod {
    /*方法实现*/
}

@end

需要留意的地方

  • Category中添加的方法尽量不要与原有类中方法重名,虽然实现上是可以这样做的,但这个绝对不是一个很好的设计。因为当你添加类重名方法之后,那么就没有办法在访问原有方法,而且降低了代码的可读性。如果需要添加一个重名方法,建议还是用继承的方式,在子类中覆写这个方法。(Demo中有相关测试代码)
  • 我们不能直接通过Category来给类添加属性,因为Category不会为我们的属性添加get和set方法,所以在调用的时候就会崩溃,但是我们可以利用runtime来添加些方法

Extension

看起来像是一个匿名的Category,但是二者还是有很多区别的。Extension通常写在.m文件中,当我们新建一个view controller子类的时候,我们可以在.m文件中看到系统会为我们自动生产一个Extension,而我们在新建一个NSObject的子类的时候,系统就不会自动为我们创建这个Extension

Extension是声明类中私有方法的好方法

如何写一个Extension

  • Objective-C
@interface MyViewController ()

- (void)myMethod;

@end

参考资料

深入理解Objective-C:Category

Class Extensions Extend the Internal Implementation

发表评论

电子邮件地址不会被公开。 必填项已用*标注