Categories in Objective-C

 本文转自Categories in Objective-C

Category,中文翻译为分类,是Objective-C中不同于C/C++一中语法。Category可以为已存在的类添加方法,即使你没有这个类的源码,听上去很诱人吧?

Category可以做什么?

  • Category提供了除子类化外,扩展类功能的另一途径。
  • 使用Category,可以将类功能按照逻辑关系分散实现,便于组织。
  • Category虽然不能够添加成员变量,但是类的成员变量对于Category实现的方法却是可见的,即使是@private变量,这个太狠了。
  • 在运行阶段,Category扩展的方法与类原有方法无异,子类同样可以享有这些继承。
  • 将类的实现分散到多个文件中,可以将一个超级大的类按逻辑分组,分别用不同Category实现。好处多多:
    • 提供简单的组合相关方法的途径。
    • 多人开发同一类时可以简化类的管理。
    • 对于编译器,这样也许在增量编译上能够节省不少时间。
    • 能够帮助改进常用方法的本地化,这点得益于Category可以重载类中现有方法。
    • 不需要维护同一份代码的多个版本即可为不同的程序定制类。
    • 声明非正式协议。

注意事项:

  • 不能够使用Category来为现有类添加成员变量,如果想这么做,请子类化现有类。
  • Category为现有类提供的方法将成为现有类的一部分,无论使用者想不想要;而子类化现有类提供的方法只会成为子类的一部分,并没有改变现有类。从这点来说,Category比子类化更狠,直接改变了类声明和定义。
  • Category没有数量限制,但是Category及其声明的方法必须保证唯一性,这个很好理解,因为对于调用者来说,不希望看到一个类有重复声明和定义的方法吧?
  • 虽然Category可以重载现有类的方法,但是不建议这么做。Category不是子类化的替身。使用Category来重载方法缺点多多:
    • 我们在子类中重载实现父类方法时,通常需要在实现中调用super的方法。然而,如果Category重载了父类的方法,那么将再也无法调用原有方法了。
    • Category重载其他Category中声明的方法是不可靠的。这点非常重要,很多Cocoa类都是利用Category实现的。你想通过Category重载的方法也许就是其他Category实现的,而究竟哪个Category的重载优先级高并没有被定义,一旦出现,死都不知道怎么死的……
    • 某些Category重载的方法可能会导致整个frameworks的行为改变。例如,如果你重载windowWillClose方法,那么你程序中所有窗口行为也许会发生变化。这一点有点经验的程序员一般都能控制好。
    • 为根类(如NSObject)添加方法有时候很有用,但也是非常危险的。虽然看上去Category导致的改动是可控的,然而继承会让你失去控制。也许你的改变对那些你看不到的类会造成意想不到的改变。

Category是把双刃剑,慎用!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值