Objective-C类别

类别

利用objective-c的动态运行时分配机制,可以为现有的类添加新方法。

1.类别的声明

@interface NSString (NumberConvenience)
 - (NSString *) lengthAsNumber;
 @end //NumberConvenience

 上面的声明表示:类别的名称是NumberConvenience,而且该类别将向NSString类中添加方法lengthAsNumber。

 只要保证类别的唯一性,可以向一个类中添加任意多的类别。

2. 实现类别

@implementation NSString (NumberConvenience)
- (NSString *) lengthAsNumber{
	unsigned int length = [self length];
	return ([NSNumber numberWithUnsignedInt: length]);
}//lengthAsNumber
@end // NumberConvenience

3.类别的局限性

a.无法向类中添加新的实例变量,类别没有位置容纳实例变量

b.名称冲突,即类别中的方法与现有的方法重名,当发生冲突时类别具有更高的优先级。

4.类别的作用

(1).将类的实现分散到多个不同文件或者不同的框架中

(2).创建对私有方法的前向引用

【Cocoa中没有真正的私有方法,则实现私有方法类似功能的方法为:

先在类别中声明方法;然后到现有类的实现中实现该方法。

这样这个类中的其他方法可以使用该方法,而其他外部的类就不会知道该方法的存在了。】

(3).向对象添加非正式协议。

【创建一个NSObject的类别称为创建一个非正式协议。】

5.委托delegate是一种对象,另一个类的对象会要求委托对象执行它的某些操作。

受委托对象在某个时间(某个事件触发)时,会自动通知委托对象执行委托方法。 

6.选择器:@ selector():选择器只是一个方法名称,但它以objective-c运行时使用的特殊方式编码,以快速执行查询。圆括号中的内容是方法名。

所以Car类的setEngine:方法的选择器是:@ selector (setEngine:)

受委托对象如何知道其委托对象是否能处理它(受委托对象)发送给它(委托对象)的消息?

通过选择器,受委托对象先检查委托对象,询问其是否能响应该选择器。如果能,则向它发送消息。

猜你喜欢

转载自azlove.iteye.com/blog/1678131