我想知道是否有人可以解释Objective C中的非正式协议?我尝试在苹果文档和其他一些书籍上理解它,但我的头仍在旋转,所以如果有人可以用例子来解释,我将非常感激.
谢谢.
bbu*_*bum 59
正如Jonnathan所说,一个非正式协议通常是在NSObject上声明的类别,没有相应的实现(最常见的是 - 在NSObject上提供虚拟实现的罕见协议).
从10.6开始(以及在iPhone SDK中),不再使用此模式.具体来说,在10.5(及之前)中声明如下:
@interface NSObject(NSApplicationNotifications)
- (void)applicationWillFinishLaunching:(NSNotification *)notification;
...
@interface NSObject(NSApplicationDelegate)
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender;
...
Run Code Online (Sandbox Code Playgroud)
现在声明为:
@protocol NSApplicationDelegate <NSObject>
@optional
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender;
...
- (void)applicationWillFinishLaunching:(NSNotification *)notification;
...
Run Code Online (Sandbox Code Playgroud)
也就是说,现在@protocol
使用一堆@optional
方法将非正式协议声明为s .
在任何情况下,非正式协议都是方法声明的集合,您可以选择实现方法来更改行为.通常,但并非总是如此,方法实现是在委托的上下文中提供的(表视图的数据源必须实现一些必需的方法,并且可以选择性地实现一些其他方法).
非正式协议的一个常见例子是定义回调.假设您使用的库允许您在后台下载某些内容.此库允许您注册完成时要调用的回调对象.
- (void)download:(NSURL*)url whenComplete:(id)callback
Run Code Online (Sandbox Code Playgroud)
下载完成后,它将在您的回调对象上调用特定方法:
- (void)downloadComplete:(NSURL*)url
Run Code Online (Sandbox Code Playgroud)
当然,无法保证您的回调对象实际上实现了此方法.非正式协议NSObject
使用类别提供这些方法的简单实现.因此,系统中的所有对象都将响应该downloadComplete:
方法,但默认情况下它们不会响应该方法.覆盖该downloadComplete:
方法的类可以提供更多有用的功能.
到目前为止,您可以使用正式协议完成相同的任务.但是,非正式协议允许您使用可选方法.实现正式协议的类必须为协议中的每个方法提供实现.实现非正式协议的类可以省略任何方法的实现 - 它已经从中继承了实现NSObject
.
从Objective-C 2.0开始,正式协议可以包含可选方法.此外,Apple可能正在摆脱新API的非正式协议 - 这UIAccelerometerDelegate
是一种正式的协议.
小智 5
我们informal protocol
通过对类别声明中的方法进行分组来定义,
@interface NSObject ( MyXMLSupport )
- initFromXMLRepresentation:(NSXMLElement *)XMLElement;
- (NSXMLElement *)XMLRepresentation;
@end
Run Code Online (Sandbox Code Playgroud)
Informal protocol
s通常被声明为类的NSObject
类别,因为它广泛地将方法名称与任何继承的类相关联NSObject
.
因为所有类都继承自根类,所以这些方法不限于继承层次结构的任何部分.(也可以将informal protocol
一个类声明为另一个类的类别,将其限制为继承层次结构的某个分支,但没有理由这样做).
当用于声明协议时,类别接口没有相应的实现.相反,实现该协议的类在它们自己的接口文件中再次声明这些方法,并将它们与其实现文件中的其他方法一起定义.
非正式协议是一种通过类别向对象添加可选方法的方法.
因此可能会出现一个疑问
如果协议本身有任何可选方法,它会成为非正式协议吗?
答案是不.
如果方法是在协议中声明的,并且它被认为符合一个类而没有使用任何类别,则它是正式的协议.
注意:
方案c 2.0中引入了方案中的可选方法,因此在此之前,目的是通过非正式协议Ie通过类别实现的.
类别:
它是一种语言级功能,旨在替代子类别即继承.
我希望它对此有所了解......
归档时间: |
|
查看次数: |
21166 次 |
最近记录: |