现在的位置: 首页 > 综合 > 正文

【iOS知识学习】_协议(delegate)和类别(category)

2018年04月22日 ⁄ 综合 ⁄ 共 1349字 ⁄ 字号 评论关闭

在iOS开发中,协议和类别是用的非常多的功能。

协议(delegate):声明一系列的方法,可由任何类实施,即使遵守该协议的类没有共同的超类。协议方法定义了独立于任何特定类的行为。简单的说,协议就是定义了一个接口,其他类负责来实现这些接口。如果你的类实现了一个协议的方法时,则说该类遵循此协议。

协议的申明:

@protocol MyProtocol
@required
-(void) method1;
@optional
-(void)method2;
@end

一个协议定义了一系列的方法,这些方法在对象之间建立合约,而无需使那些对象成为任何特定类的实例,此合约使那些对象能够相互通信。一个对象想要告诉另一个对象它遇到的事件或者它可能想要寻求有关事件的建议。

比如tableview继承了UITableViewDelegate协议,这样通过调用指定的tableview的特定方法就能传递那些tableview的通知了,在头文件(.h)文件中,该类采用一个协议,就要将该协议的名称放在尖括号(<……>)中,并且放在它继承的类的名称后面,比如:

@interface MyViewController : UIViewController<UITableViewDelegate,UITableViewDataSource>

对于许多委托协议来说,采用一个协议仅仅是实现该协议定义的方法,有些协议要求明确的声明支持该协议,而协议可以指定必须实现方法和可选方法。

类别(category):类别是Objective-C的一项功能,可扩展类的接口,而无需对类进行子类化。category 可以为已经存在的类增加方法,而不需要增加一个子类。而且,我们可以在不知道某个类内部实现的情况下,为该类增加方法。如果我们想增加某个框架(framework)中的类的方法,category 就非常有效。比如,如果想在NSString 上增加一个方法,那么就可以这样做:

@interface NSString (extension)
-(void) method;
@end

categoty没有父类,类后面的括号里写类别的名字。

@implementation NSString(extension)  

-(void) method{
     ……
}

@end

这个时候就可以在NSString类的对象上调用这个方法了。

注意:类别并不能为类声明新的实例变量,他只包含方法。然而在类作用域内所有实例变量,都能被这些类别访问。他们包括为类声明的所有的实例变量,甚至那些被@private 修饰的变量。可以为一个类添加多个类别,但每个类别名必须不同,而且每个类别都必须声明并实现一套不同的方法。

要记住,我们通过 category 来修改一个类的时候,他对应应用程序里这个类所有对象都起作用。跟子类不一样,category 不能增加成员变量。我们还可以用 category里重写类原先存在的方法(但是并不推荐这么做)。

可以将类别作为一种手段,对头文件中的相关方法声明进行分组,甚至还可以将不同的类别声明放在不同的头文件中,框架在其所有的头文件中使用这些技巧达到清晰明确的效果,还可以使用称为类别扩展的匿名类别,在实现文件(.m)文件中声明专有的属性和专有的方法,类扩展看起来类似于类别,只是圆括号之间没有文本。

抱歉!评论已关闭.