类别(category)——通过使用类别,我们能够动态地为现有的类加入新方法。并且能够将类定义模块化地分不到多个相关文件里。通常仅仅在类别中定义方法。

类别,接口部分的定义,通常该文件命名为已有"类+类别名.h"
@interface 已有类 (类别名)
//.......方法实现
@end

比如。考虑为NSNumber添加一个类别,则接口部分代码例如以下

#import <Foundation/Foundation.h>
@interface NSNumber (code)
@end

该类别的实现部分例如以下

#import "NSNumber+code.h"

@implementation NSNumber (code)
-(NSNumber *) add:(double) num
{
return [NSNumber numberWithDouble:([self doubleValue] +num)];
}
-(NSNumber *) mult:(double) num
{
return [NSNumber numberWithDouble:([self doubleValue] +num)];
}
@end
全部NSNumber类的实例就都会具有add:、multi:方法。从而实现对NSNumber类的动态扩展。

我们知道。假设一个函数在.h文件里无声明而在.m文件里定义它的实现。那么该方法就是私有方法。仅仅能在本类的文件里使用。若我们在类别的接口部分声明这种方法。那么我们就能够实现对该私有方法的訪问。

—————————————————————————————————————————————————————————————————————————————

扩展(extension)

扩展与类别相似,扩展相当于匿名类别。即没有类别名得类别

类别,接口部分的定义,通常该文件命名为已有"类_xxx.h"
@interface 已有类 ()
//.......方法实现
@end

在使用方法上。类别通常都都有单独的.h和.m文件。扩展则是暂时的对某个类进行扩展,类的实现部分同一时候实现类接口部分定义的方法和扩展中定义的方法。定义类的扩展时,能够添加额外的实例变量,也可使用@property和@synthesizekeyword,但在定义类的列表时不同意额外定义实例变量。

有类名为Vehicle,仅仅有name属性未定义方法。

对其进行扩展

#import "vehicle.h"
@interface Vehicle ()
@property(nonatomic, strong) NSString *color;
-(void) drive:(NSString *)name;
@end

为原来的Vehicle类添加color属性和drive:方法。因此在Vehicle.m实现文件中面要实现Vehicle.h里声明的方法及这个drive:方法。

//"Vehicle.m"
#import "Vehicle_ext.h"
@implementation Vehicle
-(void) drive:(NSString *)name
{
NSLog(@"交通工具名称%@,颜色属性%@",_name,_color);
}
@end

在实际使用中,通用的做法是省略掉Vehicle_ext.h文件,而是将当中的内容直接加入在Vehicle.m文件@implementation前部就可以。

—————————————————————————————————————————————————————————————————————————————

协议(protocol)

类别(catgory)能够实现非正式协议。以NSObject为基础,为NSOject创建类别。创建类别时指定该类新增的方法,这是实现非正式协议的过程。而OC中对于实现非正式协议的类而言,OC并不强制实现该协议中的全部方法 。

正式协议使用@protocolkeyword定义

@protocol 协议名 <父协议1, 父协议2>
{
//.....方法声明
}
@end

协议是支持多继承的。在OC2.0标准中新增了@required\@optional两个keyword,声明方式是必须是必须实现还是可选的,默觉得@required.

遵守协议的语法例如以下

@interface 类名:父类型 <协议1, 协议2...>

使用协议来定义变量。那么这些变量仅仅能调用该协议中声明的方法,否则编译器会提示错误。

使用协议来定义变量的两种语法

NSObject<协议1。协议2..>*变量名;
id<协议1。协议2...> 变量。

协议体现的是一种规范,定义协议的类能够把协议定义的方法托付(delegate)给实现协议的类,这样能够让类具有更好的通用性,详细的动作交给协议的实现类来完毕。在大量的应用程序开发中大量依赖托付这个概念。


OC中类别、扩展、协议与托付的更多相关文章

  1. OC中类别、扩展、协议与委托

    一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...

  2. 【IOS 开发】Objective - C 面向对象高级特性 - 包装类 | 类处理 | 类别 | 扩展 | 协议 | 委托 | 异常处理 | 反射

    一. Objective-C 对象简单处理 1. 包装类 (1) 包装类简介 NSValue 和 NSNumber : -- 通用包装类 NSValue : NSValue 包装单个 short, i ...

  3. oc中的分类/协议/属性

    1.分类:当我们想给某个类加一些方法时,如果不想通过继承这个类来实现,可以通过分类给这个类加一些行为,这个过程与继承相比更加轻量化. @interface NSString (SubClass) -( ...

  4. 设计模式之原型模式(深入理解OC中的NSCopying协议以及浅拷贝、深拷贝)

    原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.原型模式其实就是从一个对象再创建另一个可定制的对象,而且不需知道任何创建的细节. 比如说,有一个Person类,有firstN ...

  5. OC中协议的概念以及用法

    OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习 ...

  6. (转载)OC学习篇之---协议的概念和用法

    在前一篇文章中我们介绍了OC中类的延展,这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Jav ...

  7. OC学习篇之---协议的概念和用法

    这一篇文章我们在来看一下OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字 ...

  8. OC中保存自定义类型对象的持久化方法

    OC中如果要将自定义类型的对象保存到文件中,必须进行以下三个条件: 想要把存放自定义类型的数组进行 持久化(就是将内存中的临时数据以文件<数据库等>的形式写到磁盘上)必须满足: 1. 自定 ...

  9. OC中SEL,类别,继承,协议的使用

    1.SEL SEL是selector的缩写,selector在OC中作用是定义一个方法变量,通过该方法变量来调用方法.我们在后面的UI中会经常用selector来调用事件方法.下面我将举两个例子来说明 ...

随机推荐

  1. etTimeout与setInterval方法的区别

    etTimeout与setInterval方法的区别 setTimeout()用于设定在指定的时间之后执行对应的函数或代码.,在全局作用域下执行 setTimeout(code,time[,args… ...

  2. Sublime Text 2中前端必备的常用插件

    Sublime Text 2安装的插件和所有预置的插件全部在Packages文件下,可以直接通过”preferences“—>”Browse Pakcages“来访问. Sublime Text ...

  3. 用POLL的方式,没有跑出结果来,立此存照

    咦,这些内容,和我以前看内核时的东东,对应起来了.. SELECT,POLL,EPOLL,非阻塞,异步之类的... 但我没有调出来.回家有空了可以看看,不用再敲打代码啦... #!/usr/bin/e ...

  4. SQL SELECT基本语句结构

    (1)SELECT select_list (2) FROM table_list (3)   WHERE search_conditions     GROUP BY group_by_list   ...

  5. [topcoder]BinarySearchable

    http://community.topcoder.com/stat?c=problem_statement&pm=5869&rd=8078 这道题有点意思,思考理解后,就是找数组中的 ...

  6. Unicode(UTF-8, UTF-16)令人混淆的概念

    为啥需要Unicode 我们知道计算机其实挺笨的,它只认识0101这样的字符串,当然了我们看这样的01串时肯定会比较头晕的,所以很多时候为了描述简单都用十进制,十六进制,八进制表示.实际上都是等价的, ...

  7. poj2482

    (题外话:这题这是ACMer的福利啊……)我非常不擅长做矩形类的数据结构一般来说,二维的问题我们要转化为一维来考虑感觉一般的手法是对一维排序,并且线性扫描这一维,然后用各种数据结构维护另一维上的最优值 ...

  8. 2015第44周六tomcat集群了解

    对于WEB应用集群的技术实现而言,最大的难点就是如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点,大体上有两种方式,一种是把所有Sessi ...

  9. 杂项(最小表示法):HZOI 2015 Glass Beads

    [题目描述] 给定长度为n(n<=300000)的循环同构的字符串,定义最小表示为该字符串的字典序最小的同构表示,请输出这个表示. [输入格式] 第一行是串的长度,第二行是字符串. [输出格式] ...

  10. U盘安装 OSX

    首先,刚从app store下载完的OS X Lion会放在屏幕下方的Dock中. 用鼠标将Mac OS X Lion 10.7文件从Dock中拖放到桌面. 右键单击Mac OS X Lion 10. ...