很多时候我们需要扩展一下现有的类,增加一点功能。如果有源码,修改一下即可,如果是第三方的库,就要麻烦一些。在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的更多相关文章

  1. 设计模式之开放-封闭原则(引申出Objective-C中继承、Category、Protocol三者的区别,这点面试常问)

    开放封闭原则(OCP原则The Open-Closed Principle)是面向对象的核心设计所在.它是说,软件开发实体(类.模块.函数等)应该可以扩展,但是不能修改. 这个原则有两个特征,一个是说 ...

  2. objective c, category 和 protocol 中添加property

    property的本质是实例变量 + getter 和 setter 方法 category和protocol可以添加方法 category 和 protocol中可以添加@property 关键字 ...

  3. 转iOS中delegate、protocol的关系

    iOS中delegate.protocol的关系 分类: iOS Development2014-02-12 10:47 277人阅读 评论(0) 收藏 举报 delegateiosprocotolc ...

  4. iOS类别(Category)

    iOS类别(Category)与扩展(Extension) 苹果的官方文档 Category在iOS开发中使用非常频繁.尤其是在为系统类进行拓展的时候,我们可以不用继承系统类,直接给系统类添加方法,最 ...

  5. ios category,protocol理解

    category: 向现有的类中增加方法,同时提供方法的实现,现有类不需要做任何改动. protocol:(相当于Java或C#中的接口interface,当很多类都要需要类似的方法,但是方法具体实现 ...

  6. Objective-C——消息、Category和Protocol

    转自:http://www.cnblogs.com/chijianqiang/archive/2012/06/22/objc-category-protocol.html 面向对象永远是个可以吐槽的话 ...

  7. iOS中Category和Extension 原理详解

    (一)Category .什么是Category? category是Objective-C .0之后添加的语言特性,别人口中的分类.类别其实都是指的category.category的主要作用是为已 ...

  8. 04OC之分类Category,协议Protocol,Copy,代码块block

    一.Protocol协议 我们都知道,在C#有个规范称之为接口,就是规范一系列的行为,事物.在C#中是使用Interface关键字来声明一个接口的,但是在OC中interface是用来声明类,所以用了 ...

  9. iOS - OC Category 分类

    1.Category 1)分类/类别(category): 允许以模块的方式向现有类定义添加新的方法(默认不能添加实例变量).用以扩展自己或他人以前实现的类,使它适合自己的需要. 分类的名称括在类名之 ...

随机推荐

  1. 安装eclipse

    前提,安装好jdk并成功配置好环境变量 下载eclipse-standard-kepler-R-win32-x86_64,直接打开里面的eclipse.exe文件即可

  2. 像素转换问题-队列解决办法(或者dfs)

    在一定大小的像素图像中,将同色区域的颜色值替换为其他颜色值,从而产生新的图像,输入数据,图像大小,指定的像素点坐标,要替换成的颜色. 一开始出队操作写错了折腾半天,当队列中只有一个元素是出队后要将队首 ...

  3. requirejs--源码分析

    /*---------------------------------------start-------------------------------*/ req({}); // num == 1 ...

  4. C#中委托和事件

    目 录 将方法作为方法的参数 将方法绑定到委托 更好的封装性 限制类型能力 范例说明 Observer 设计模式简介 实现范例的Observer 设计模式 .NET 框架中的委托与事件 为什么委托定义 ...

  5. Myeclipse 2014配置SVN详细图解

    1.什么是SVN? 管理软件开发过程中的版本控制工具. 2.myeclipse安装SVN插件步骤,以myeclipse 2014为例. (1)下载SVN插件 http://subclipse.tigr ...

  6. SignalR with ASP.NET MVC5 可用于倒计时同步

    原文地址:http://www.codeproject.com/Articles/806919/SignalR-with-ASP-NET-MVC

  7. linux命令之pwd(print working drectory)

    Linux中用 pwd 命令来查看”当前工作目录“的完整路径. 简单得说,每当你在终端进行操作时,你都会有一个当前工作目录. 在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. ...

  8. JS页面赋值

    <html>  <title>页面1</title> <div> <ul>  <li> <div class=" ...

  9. Exchange Cards(dfs)

    Exchange Cards Time Limit: 2 Seconds      Memory Limit: 65536 KB As a basketball fan, Mike is also f ...

  10. OAuth2.0认证介绍

    OAuth2.0鉴权 返回 目录 [隐藏] 1 腾讯微博OAuth2.0认证介绍 2 获取accesstoken的两种方式 2.1 1.Authorization code grant 2.1.1 第 ...