你要知道的KVC、KVO、Delegate、Notification都在这里
转载请注明出处 http://blog.csdn.net/u014205968/article/details/78224825
本系列文章主要通过讲解KVC、KVO、Delegate、Notification的使用方法,来探讨KVO、Delegate、Notification的区别以及相关使用场景,本系列文章将分一下几篇文章进行讲解,读者可按需查阅。
- KVC 使用方法详解及底层实现
- KVO 正确使用姿势进阶及底层实现
- Protocol与Delegate 使用方法详解
- NSNotificationCenter 通知使用方法详解
- KVO、Delegate、Notification 区别及相关使用场景
Protocol与Delegate 使用方法详解
protocol
协议类似于Java
的接口,规定一系列实现类应该遵守的方法,OC
中protocol
协议远没有Java
中的interface
使用频率高,毕竟在Java
中面向接口编程更加盛行,但OC
使用较频繁的代理模式delegate
就是以protocol
作为基础实现的。代理模式是OC
中一个非常重要的概念,接下来将从protocol
协议开始逐一进行讲解。
实现协议还有一种方法,就是通过类别category
实现,前面两篇文章讲解的KVC
和KVO
的实现都是依赖于类别而不是接口,类别提供了一种限定性更弱,并且不需要修改源代码的方式来为已有类添加新的方法,非常适用于扩展第三方或是系统提供的已有类。
接下来举一个通过类别category
扩展实现协议的栗子:
#import <Foundation/Foundation.h>
@interface NSObject (Flyable)
- (void)fly;
@end
@interface Bird : NSObject
@end
@implementation Bird
- (void)fly
{
NSLog(@"I can fly!!!");
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSObject *obj = [[Bird alloc] init];
[obj fly];
}
return 0;
}
上面的栗子首先定义了一个Flyable
的类别,扩展的是NSObject
类,接着定义了Bird
类,该类继承自NSObject
类,因此也继承了fly
方法,在Bird
类的实现中实现了fly
方法,因此在main
函数中可以通过NSObject
来调用fly
方法。category
类别并不要求扩展类的子类实现类别中声明的所有方法,因此,如果Bird
类没有实现fly
方法再调用fly
方法时会抛出异常,因此,正确的使用方法应该先判断其是否能够响应相关方法:
int main(int argc, const char * argv[]) {
@autoreleasepool {
NSObject *obj = [[Bird alloc] init];
//判断是否能够响应fly方法
if ([obj respondsToSelector:@selector(fly)])
{
[obj fly];
}
}
return 0;
}
类别category
不能强制要求子类实现其声明的方法,所以如果有必须要子类实现的方法应当使用protocol
协议来定义,举个协议的例子:
#import <Foundation/Foundation.h>