很多时候我们需要扩展一下现有的类,增加一点功能。如果有源码,修改一下即可,如果是第三方的库,就要麻烦一些。在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. 由EmbeddedFileProvider构建的内嵌(资源)文件系统

    由EmbeddedFileProvider构建的内嵌(资源)文件系统 一个物理文件可以直接作为资源内嵌到编译生成的程序集中.借助于EmbeddedFileProvider,我们可以统一的编程方式来读取 ...

  2. Delphi与字符编码(实战篇)(MultiByteToWideChar会返回转换后的宽字符串长度)

    本文目标: 了解Delphi的字符串类型 字符编码的检测与转换 简体繁体转换 0. 导言 看完“.Net与字符编码(理论篇)”,我们明白了字符是自然语言中的最小单位,在存储和传输的过程中可以使用三种编 ...

  3. SQL Server 2008数据库的一些基本概念 区、页、行

    原文地址:http://www.cnblogs.com/liuzhendong/archive/2011/10/11/2207361.html 以前总是没弄明白这些基本概念,现在整理如下: 1.区: ...

  4. Linux常用C函数---字符测试篇

    函数讲解部分参考http://net.pku.edu.cn/~yhf/linux_c/ isalnum(测试字符是否为英文或数字) 相关函数 isalpha,isdigit,islower,isupp ...

  5. 【HDU 4451 Dressing】水题,组合数

    有衣服.裤子.鞋数量分别为n,m,k,给出p对不和谐的衣-裤或裤-鞋搭配,问一共有多少种和谐的衣裤鞋的搭配. 全部的组合有Cn1Cm1Ck1种. 设p对中有p1对衣-裤,p2对裤-鞋,则不和谐的搭配共 ...

  6. Android分析第三方应用layout的神器

    hierarchyviewer.bat或者monitor.bat一直都是分析layout的神器,只是.非常多时候不好用,连不上真机,害的我不得不使用模拟器来分析layout. 今天发现了另外一个神器. ...

  7. 月赛-Crackhash

    Crackhash 这个题目是我为月赛出的,完全仿照自mma 1st simple_hash. 这道题目比较有意思的地方在于在32位的程序中模拟了64位的算术运算. 题目的思路很清晰.要求输入全为数字 ...

  8. Asp.Net Web API 2

    Asp.Net Web API 2第十八课——Working with Entity Relations in OData   前言 阅读本文之前,您也可以到Asp.Net Web API 2 系列导 ...

  9. JavaScript 中 关于 this 的学习笔记

    今天上午主要学习了js中的 this ,因为之前学习面向对象时,this这个东西出现的还是很频繁的,理解的很不透彻,感觉老被JAVA的思想带进坑里,所以对它特别关注. 首先贴一个大神的一篇博客,我是通 ...

  10. linux下Java环境的配置

    linux下Java环境的配置 现在用linux的朋友越来越多了,前几天就有两个朋友问我linux下怎么配置java环境,我想还有很多朋友想了解学习这方面的东西,就写一个完全一点的linux java ...