如何使用Categories
对于在Objective-C中Categories的使用,有以下几种情况:
1)扩展已有的类
举个例子,你可以向Cocoa框架中定义好的类中增加新的方法。新增的方法同时也会被子类继承,在运行时将无法区分这些方法是新增的还是原来类已经定义好的。
2)作为子类的替代方案
除了通过定一个子类来扩展已有的类,你也可以通过Category直接向已有的类增加新的方法来实现。举例来说,你可以向NSArray和其它Cocoa类增加新的Categories来扩展已有的类。如同定义子类,你同样也不需要知道被扩展类的源代码。
3)通过使用多个代码文件来定义一个类
举个例子,你可以将一个规模比较大的类所有方法进行分组,然后将每组方法放到一个Category中,每个Category则用一个文件来定义。在开发过程中,这样的好处是显而易见的。
- 提供一个简单的方法对相关的方法进行分组。不同的类中相似的方法可以统一放到相同的文件中
- 如果有多个开发人员需要同时实现一个类,通过将类的方法分成不同的Categories可以简化代码管理
- 可以对一个规模非常大的类进行增量编译,减少重复编译的时间
- 可以将常用方法集中在一起,便于查找和参考
- 如果同一个类针对不同的应用有不同的实现,可以将不同的部分分别放入一个单独的文件中,以便代码的维护
4)可以申明非正式的协议(protocols)
尽管Objective-C能够允许使用Category覆盖重写类方法,甚至是定义在类接口中的方法,但强烈不建议这种用法。
Category不能完全代替子类,有以下几个最大的缺点:
- 当在Category中覆盖一个继承的方法,在Category中的方法可以通过向super类发送一个消息来调用被继承的方法。但是,如果Category中覆盖的那个方法已经在这个类的其它Category定义过了,则之前定义的方法将没有机会被程序调用
- 在Category中无法确定其能够可靠的覆盖某个方法,而这个方法已经在其它的Category中定义过。这个问题在使用Cocoa框架时尤其突出。当你想覆盖某个框架已经定义好的方法时,该方法已经在其它Category中实现,这样就无法确定哪个定义和实现会被最先使用,带来很大的不确定性。
- 如果你重新覆盖定义了一些方法,往往会导致这个方法在整个框架中实现发生了变化。举例来说,如果你增加了NSObject中windowWillClose:的实现,这会导致所有的窗口调用那个新实现的方法,从而改变所有NSWindows实例的行为。这会带来很多不确定性,并很有可能导致程序的崩溃。
以上翻译自'The Objective-C Programming Language' of Apple Inc.
转载于:https://www.cnblogs.com/iearth/archive/2011/02/14/1954443.html
如何使用Categories相关推荐
- Usage and Idioms——Categories
Category含义:Category继承自Suit,Category似乎是Suit的加强版,它和Suit一样提供了将若干测试用例类组织成一组的能力,除此以外它可以对各个测试用例进行分组,使你有机会只 ...
- PHP和MySQL Web开发从新手到高手,第8天-创建categories管理页面
1. 创建categories管理页面 主要包含以下几个页面: A. index.php, 准备各种变量数据.供展示页面使用. B. categories.html.php, 显示categories ...
- ValueError: fill value must be in categories.
执行下面代码时报错:ValueError: fill value must be in categories import pandas as pd; import numpy as np;df = ...
- 【 Notes 】Categories of Wireless Local Positioning Systems
Categories of Wireless Positioning Systems Basically, a wireless local-positioning system consists o ...
- 成功解决ValueError: fill value must be in categories
成功解决ValueError: fill value must be in categories 目录 解决问题 解决思路 解决方法 解决问题 ValueError: fill value must ...
- 成功解决 ValueError: fill value must be in categories
成功解决 ValueError: fill value must be in categories 目录 解决问题 解决思路 解决方法 解决问题 raise ValueError("fill ...
- patent sub categories
patent sub categories How there Invention patent Utility model patents Appearance patent
- categories php,manage-categories.php
include 'common.php'; include 'header.php'; include 'menu.php'; Typecho_Widget::widget('Widget_Metas ...
- Magento: 获取类别所有子类别 (无限级别-目录树) Get All Sub Categories
生成分类目录树(Category Tree) $rootcatId = Mage::app()->getStore()->getRootCategoryId(); $categories ...
- magento 获取类别和子类别 Display Categories and SubCategories in Magento
当前类别id和title $layer = Mage::getSingleton('catalog/layer'); $_category = $layer->getCurrentCategor ...
最新文章
- NBTC明年6月将举行5G频谱拍卖 2.6GHz频段成关注重点
- JSF Struts Spring Hibernate 整合
- 不懂Python装饰器?教程双手奉上!
- STM32工作笔记0092---CAN通信基础知识介绍-M3
- JSONObject以及json(转)
- 实践实践在实践,才能牛逼得一逼。Python
- 重要数据 | 数据分类和分级概念解析
- php string to xml,php 字符串如何转换成xml
- python怎么更新列表_python更新列表的方法
- 台安变频器n2按键说明_台安n2系列变频器说明书
- 关于雅虎邮箱的Foxmail,outlook设置。
- linux摄像头内核驱动开发,Linux系统下USB摄像头驱动开发
- Java中自定义比较器
- 佰落暑期java自学记录-9
- 我用MOS管做开关管却不能关闭?
- UIdemo 制作一个简单的iPhone相册
- 微信小程序中如何将数据保存到内存中并且读取的同步写法
- C语言函数中的3个点 ...有什么作用
- win怎么在计算机里按日期搜索文件,Windows下怎么按时间查找文件
- linux kernel decompress_kernel 启动解压