iOS的category和protocol
很多时候我们需要扩展一下现有的类,增加一点功能。如果有源码,修改一下即可,如果是第三方的库,就要麻烦一些。在C++中我们使用类继承的方法来实现,在ObjectiveC中当然也可以这么做,不过ObjectiveC还提供的一种简单实用的方法,就是category,对于一些很微小的功能增加,或者就是增加一个方法方便使用,用category是最轻量级的。
xCode中已经提供了增加category的引导,比如我们想增加以下UILabel的内容竖直对齐的方法,那么就需要如下进行一定的设置:
生成的文件名字是UILabel+VAlign.h/m,虽然不是必须是这样的,但往往约定俗成是类名+类别名。
生成的代码如下:
@implementation UILabel (VAlign) @end
我们可以看见,这个和类的实现是很相似的,只是多了一个(VAlign),这个就说明这是UILabel类的一个名称是VAlign的类别。我们可以在类别里面添加方法,但是不能添加成员变量。这里又有一个特殊的地方,不能添加成员变量,显然就不能添加属性了,但我们可以用@dynamic关键字来添加属性(还是不能直接添加成员变量)。
Category的方便性还是显而易见的,在开发过程中,常常会遇到需要对类进行修改,增加一些方法的情形。这样通过category机制,我们可以很简洁的实现这样的需求,同时也减轻了类的设计的难度。
但Category也有它自身的缺点,一是无法添加新的成员变量,二是由于代码可能很分散,容易出现方法的重名。当方法出现重名时,类别的优先级是高于类本身的,就是说,如果类有一个foo()的方法,category也有一个foo()的方法,则我们使用foo()方法时,调用的时category的foo()方法。
有一种特别的category,叫做class extension,它可以增加成员变量!它的语法格式就是无名的category
@implementation UILabel () @end
你可以增加多个class extension,但如果使用过滥,也容易带来Bug。
Category主要用途有3个:将类的实现代码分散到多个不同的文件和框架中,创建对死以后方法的前向引用,向对象添加非正式协议(informal protocol)。
Category是非正式协议,那么iOS中肯定存在正式协议了(Protocol),正式的协议不像category一样松散,它是一系列方法的集合,分成强制和非强制两部分,当你要实现一个协议时,你需要实现所有强制方法,非强制方法可以根据实际情况来实现。 可以被继承。protocol可以继承,使用时是在类声明时用<>说明,常见的NSCopying、UITableViewDataSource、UITableViewDelegate等等。
iOS的category和protocol的更多相关文章
- 设计模式之开放-封闭原则(引申出Objective-C中继承、Category、Protocol三者的区别,这点面试常问)
开放封闭原则(OCP原则The Open-Closed Principle)是面向对象的核心设计所在.它是说,软件开发实体(类.模块.函数等)应该可以扩展,但是不能修改. 这个原则有两个特征,一个是说 ...
- objective c, category 和 protocol 中添加property
property的本质是实例变量 + getter 和 setter 方法 category和protocol可以添加方法 category 和 protocol中可以添加@property 关键字 ...
- 转iOS中delegate、protocol的关系
iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...
- iOS类别(Category)
iOS类别(Category)与扩展(Extension) 苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最 ...
- ios category,protocol理解
category: 向现有的类中增加方法,同时提供方法的实现,现有类不需要做任何改动. protocol:(相当于Java或C#中的接口interface,当很多类都要需要类似的方法,但是方法具体实现 ...
- Objective-C——消息、Category和Protocol
转自:http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html 面向对象永远是个可以吐槽的话 ...
- iOS中Category和Extension 原理详解
(一)Category .什么是Category? category是Objective-C .0之后添加的语言特性,别人口中的分类.类别其实都是指的category.category的主要作用是为已 ...
- 04OC之分类Category,协议Protocol,Copy,代码块block
一.Protocol协议 我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物.在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了 ...
- iOS - OC Category 分类
1.Category 1)分类/类别(category): 允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量).用以扩展自己或他人以前实现的类,使它适合自己的需要. 分类的名称括在类名之 ...
随机推荐
- Binary Numbers(HDU1390)
Binary Numbers 点我 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- Node.js HTTP 使用详解
对于初学者有没有发觉在查看Node.js官方API的时候非常简单,只有几个洋文描述两下子,没了,我第一次一口气看完所以API后,对于第一个示例都有些懵,特别是参数里的request和response, ...
- C/S与B/S
C/S架构简要介绍 在了解什么是B/S架构之前,我们有必要了解一下什么是C/S架构: C/S架构是第一种比较早的软件架构,主要用于局域网内.也叫 客户机/服务器模式. 它可以分为客户机和服务器两层:第 ...
- QT GUI(主)线程与子线程之间的通信——使用跨线程的信号槽
在主线程上,可以控制子线程启动,停止,清零 如果子线程启动的话,每一秒钟会向主线程发送一个数字,让主线程更新界面上的数字. 程序截图: 上代码: #include <QtGui> #inc ...
- Java GC 日志详解(转)
Java GC日志可以通过 +PrintGCDetails开启 以ParallelGC为例 YoungGC日志解释如下(图片源地址:这里) : FullGC(图片源地址:这里): http://blo ...
- flex——将Sprite控件添加到FLEX UI中
在Flex的帮助文档里,有很多例子都是扩展Sprite类的.如果想把这些实例添加到你的s:Application中,如:addChild(DisplayObject ),肯定会出错.错误的大致意思是: ...
- 有关ios中images.xcassets的导入图片等命名问题
最近遇到一个问题,就是在设置启动图片的时候,把启动图片命名设置为了xxx@2x.png, 然后应用死活没有显示启动图片,调试了很久,才发现是因为文件命名的原因. 1. 如果在图片的下方有2x或3x的标 ...
- js 推断 当页面无法回退时(history.go(-1)),关闭网页
在做一个Web项目时遇到一个需求,当页面没有前驱历史记录时(就是当前为新弹出的页面,没法做goback操作即history.go(-1)),点击返回button时直接关闭页面,否则就退回到前一页. 遇 ...
- hibou 主界面自己侧滑的定义
要打滑View参加UIPanGestureRecognizer #pragma mark 手势识别器回调方法 - (void)dragView:(UIPanGestureRecognizer *)ge ...
- C#获取本周、上周、本月、上月、本季度、上季度、本年、上一年起始时间和结束时间
/// 取得某月的第一天 /// </summary> /// <param name="datetime">要取得月份第一天的时间</param&g ...