A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Erma-King 中级黑马   /  2015-10-30 10:53  /  641 人查看  /  1 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文



什么是类别?类别是一种为现有类添加新方法的方式。

为什么使用类别或者说使用类别的目的是什么?有以下三点:

第一,可以将类的实现分散到多个不同的文件或多个不同的框架中。
如果一个类需要实现很多个方法,我们可以将方法分类,把分好的类形成类别,可以有效的管理和驾驭代码。
第二,创建对私有方法的前向引用。
第三,向对象添加非正式协议。

委托
委托的意思就是你自己想做某事,你自己不做,你委托给别人做。
在Ojbective-C中,实现委托是通过类别(或非正式协议)或者协议来实现。

举个例子:Apple要生产iPhone,Apple自己不生产(种种原因,其中之一就是在中国生产成本低,他们赚的银子多),Apple委托富士 康来生 产,本来富士康原来不生产iPhone,现在要生产了,所以他得自己加一个生产iPhone的生产线(类别,增加生产iPhone方法),这就是通过类别 来实现委托。下面用代码来说明这个例子。
....
Apple *apple = [[Apple alloc ] init];

Foxconn *fox = [[Foxconn alloc] init];

[apple setDelegate:fox];

[apple produceIPhone];

........

@implementation Apple

-(...) setDelegate:(id) x{

delegate = x; //! 将委托的生产对象指定为x

}

-(...) produceIPhone{

[delegate produceIPhone]; //! 委托对象生产iPhone

}

@interface Foxconn : NSObject

...

@end

@interface NSObject(ProduceIPhone) //! Foxconn之前就可以生产其它产品,有过声明和定义

-(...) produceIPhone //! 增加生产iPhone能力

@end

@implementation NSObject(ProduceIPhone)

//! 生产iPhone

-(...) produceIPhone{

......

}

@end

非正式协议

创建一个NSObject的类别, 称为创建一个非正式协议。为什么叫非正式协议呢?

也就是说可以实现,也可以不实现被委托的任务。

拿上面的例子来说,Apple要求Foxconn除了能生产iPhone外,还有一个要求是在一定时间内完成.由于双方没有签合同,所以时间要求和生产要求规格都是非正式协议

选择器

选择器就是一个方法的名称。选择器是在Objective-C运行时使用的编码方式,以实现快速查找。可以使用@selector预编译指令,获取 选择器 @selector(方法名)。NSObject提供了一个方法respondsToSelector:的方法,来访问对象是否有该方法(响应该消息)。

拿上面的Apple请Foxconn生产iPhone为例,Apple怎么知道Foxconn有没有生产iPhone的能力呢?Apple就通过 respondsToSelector方法询问Foxconn,是否可以生产iPhone(是否可以响应produceIPhone),询问结果是可以, 那Apple就委托Foxconn生产,Foxconn就生产出来了人们比较喜欢的iPhone产品。

正式协议
与非正式协议比较而言,在Ojbective-C中,正式协议规定的所有方法必须实现。在Ojbective-C2.0中,Apple又增加了两个关键字,协议中的方法也可以不完全实现,是哪个关键字见关键字部份的@optional,@required。

正式协议声明如下:

@protocol XXX

-(...) func1;

-(...) func2;

@end

使用协议:

@interface Object : NSObject //! Object从NSObject派生,并遵循XXX协议,要实现func1,func2函数。

...

@end

1 个回复

倒序浏览
顶一下!
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马