你要知道的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>
2465




被折叠的 条评论
为什么被折叠?



