iOS的category和protocol
来源:互联网 发布:南京软件协会 编辑:程序博客网 时间:2024/05/17 07:23
很多时候我们需要扩展一下现有的类,增加一点功能。如果有源码,修改一下即可,如果是第三方的库,就要麻烦一些。在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
- iOS的category和protocol
- iOS------消息、Category和protocol
- Category和protocol的区别
- IOS笔记-protocol、category和继承
- protocol、category和继承的区别
- Category和protocol区别
- iOS Category 和 Protocol 中的 Property 你们真的会了么?
- ios笔记--class关键字,Category,protocol和block笔记
- object-c category 和 protocol
- OC中protocol、category和继承的关系
- oc中protocol、category和继承的区别
- 在最新的Xcode中创建Protocol和Category文件
- OC基础---protocol、category和继承的区别
- 黑马程序员——OC的Category和Protocol
- oc中protocol、category和继承的区别
- NSDate和NSDateFormatter的使⽤、Category、Extension、Protocol、delegate
- OC中protocol、category和继承的关系
- 生活与技术体会
- 无锡盈达聚力科技有限公司
- 数据仓库工程师的职业规划
- UML-类图
- 前端开发-充电之路之计划
- iOS的category和protocol
- IAR C语言嵌入汇编问题
- 基础加强____【IO流个人总结】
- Centos和ubuntu装机之后的配置
- 上海鲲博通信技术有限公司(主要为用WINCE开发导航产品)
- 浅析数据流图
- Cron 表达式详解和案例
- C#多态性基础实现
- 跨进程API Hook