对于在Objective-C中Categories的使用,有以下几种情况:

1)扩展已有的类

举个例子,你可以向Cocoa框架中定义好的类中增加新的方法。新增的方法同时也会被子类继承,在运行时将无法区分这些方法是新增的还是原来类已经定义好的。

2)作为子类的替代方案

除了通过定一个子类来扩展已有的类,你也可以通过Category直接向已有的类增加新的方法来实现。举例来说,你可以向NSArray和其它Cocoa类增加新的Categories来扩展已有的类。如同定义子类,你同样也不需要知道被扩展类的源代码。

3)通过使用多个代码文件来定义一个类

举个例子,你可以将一个规模比较大的类所有方法进行分组,然后将每组方法放到一个Category中,每个Category则用一个文件来定义。在开发过程中,这样的好处是显而易见的。

  1. 提供一个简单的方法对相关的方法进行分组。不同的类中相似的方法可以统一放到相同的文件中
  2. 如果有多个开发人员需要同时实现一个类,通过将类的方法分成不同的Categories可以简化代码管理
  3. 可以对一个规模非常大的类进行增量编译,减少重复编译的时间
  4. 可以将常用方法集中在一起,便于查找和参考
  5. 如果同一个类针对不同的应用有不同的实现,可以将不同的部分分别放入一个单独的文件中,以便代码的维护

4)可以申明非正式的协议(protocols)

尽管Objective-C能够允许使用Category覆盖重写类方法,甚至是定义在类接口中的方法,但强烈不建议这种用法。

Category不能完全代替子类,有以下几个最大的缺点:

  1. 当在Category中覆盖一个继承的方法,在Category中的方法可以通过向super类发送一个消息来调用被继承的方法。但是,如果Category中覆盖的那个方法已经在这个类的其它Category定义过了,则之前定义的方法将没有机会被程序调用
  2. 在Category中无法确定其能够可靠的覆盖某个方法,而这个方法已经在其它的Category中定义过。这个问题在使用Cocoa框架时尤其突出。当你想覆盖某个框架已经定义好的方法时,该方法已经在其它Category中实现,这样就无法确定哪个定义和实现会被最先使用,带来很大的不确定性。
  3. 如果你重新覆盖定义了一些方法,往往会导致这个方法在整个框架中实现发生了变化。举例来说,如果你增加了NSObject中windowWillClose:的实现,这会导致所有的窗口调用那个新实现的方法,从而改变所有NSWindows实例的行为。这会带来很多不确定性,并很有可能导致程序的崩溃。

以上翻译自'The Objective-C Programming Language' of Apple Inc.

转载于:https://www.cnblogs.com/iearth/archive/2011/02/14/1954443.html

如何使用Categories相关推荐

  1. Usage and Idioms——Categories

    Category含义:Category继承自Suit,Category似乎是Suit的加强版,它和Suit一样提供了将若干测试用例类组织成一组的能力,除此以外它可以对各个测试用例进行分组,使你有机会只 ...

  2. PHP和MySQL Web开发从新手到高手,第8天-创建categories管理页面

    1. 创建categories管理页面 主要包含以下几个页面: A. index.php, 准备各种变量数据.供展示页面使用. B. categories.html.php, 显示categories ...

  3. ValueError: fill value must be in categories.

    执行下面代码时报错:ValueError: fill value must be in categories import pandas as pd; import numpy as np;df = ...

  4. 【 Notes 】Categories of Wireless Local Positioning Systems

    Categories of Wireless Positioning Systems Basically, a wireless local-positioning system consists o ...

  5. 成功解决ValueError: fill value must be in categories

    成功解决ValueError: fill value must be in categories 目录 解决问题 解决思路 解决方法 解决问题 ValueError: fill value must ...

  6. 成功解决 ValueError: fill value must be in categories

    成功解决 ValueError: fill value must be in categories 目录 解决问题 解决思路 解决方法 解决问题 raise ValueError("fill ...

  7. patent sub categories

    patent sub categories How there Invention patent Utility model patents Appearance patent

  8. categories php,manage-categories.php

    include 'common.php'; include 'header.php'; include 'menu.php'; Typecho_Widget::widget('Widget_Metas ...

  9. Magento: 获取类别所有子类别 (无限级别-目录树) Get All Sub Categories

    生成分类目录树(Category Tree) $rootcatId = Mage::app()->getStore()->getRootCategoryId(); $categories ...

  10. magento 获取类别和子类别 Display Categories and SubCategories in Magento

    当前类别id和title $layer = Mage::getSingleton('catalog/layer'); $_category = $layer->getCurrentCategor ...

最新文章

  1. NBTC明年6月将举行5G频谱拍卖 2.6GHz频段成关注重点
  2. JSF Struts Spring Hibernate 整合
  3. 不懂Python装饰器?教程双手奉上!
  4. STM32工作笔记0092---CAN通信基础知识介绍-M3
  5. JSONObject以及json(转)
  6. 实践实践在实践,才能牛逼得一逼。Python
  7. 重要数据 | 数据分类和分级概念解析
  8. php string to xml,php 字符串如何转换成xml
  9. python怎么更新列表_python更新列表的方法
  10. 台安变频器n2按键说明_台安n2系列变频器说明书
  11. 关于雅虎邮箱的Foxmail,outlook设置。
  12. linux摄像头内核驱动开发,Linux系统下USB摄像头驱动开发
  13. Java中自定义比较器
  14. 佰落暑期java自学记录-9
  15. 我用MOS管做开关管却不能关闭?
  16. UIdemo 制作一个简单的iPhone相册
  17. 微信小程序中如何将数据保存到内存中并且读取的同步写法
  18. C语言函数中的3个点 ...有什么作用
  19. win怎么在计算机里按日期搜索文件,Windows下怎么按时间查找文件
  20. linux kernel decompress_kernel 启动解压

热门文章

  1. 线性内插interp1函数用法
  2. Python通过MQTT协议上传物联网数据给ThingsBoard
  3. 亚马逊精品处理邮件回复
  4. 从RMSE和MSE到更多选择:探索机器学习模型性能指标
  5. MongoDB未授权访问
  6. 【2022年】Win11修改锁屏界面、登录界面背景图片方法(亲测有效)
  7. 动态规划(dp)总结
  8. android WIFI学习总结
  9. java登录界面代码
  10. 清除90天苹果充值记录_苹果内购退款2020千万要知道的技巧,不得不看!