运行时是执行编译器编译链接后的C代码,例如OC创建Person对象,[[Person alloc]init];运行时objc_msgSend(objc_msgSend("Person" , "alloc"), "init");运行时是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API;runtimeAPI的实现是用 C++ 开发的(源码中的实现文件都是mm),是一套苹果开源的框架。Cocoa 中的大部分方法都是继承与NSObject,也继承了它的方法。唯一特殊的是NSProxy,它是个抽象的超类,它实现了一些消息转发的方法,可以继承它实现一些类的替身类或者是虚拟出一个不存在的类。有的方法起到了抽象接口的左右,比如description方法需要你在重载它并为你提供的类添加描述信息。NSObject还有一些方法能获取到运行时类的信息,比如class:返回对象的类;isKindOfClass:和isMemberOfClassL:则检查对象是否存在某个类继承体系中;respondsToSelector则检查对象能否响应某方法;conformToProtocol则检查是否实现了指定的协议;mothodForSelector则返回方法实现的地址。
接下来用运行时给UITableView设置两个代理:
第一步:TableViewTowDelegate.h
#import<Foundation/Foundation.h>
#import<UIKit/UIKit.h>
@interface TableViewTowDelegate : NSObject<NSObject>
@property (nonatomic, weak) id<NSObject> firstDelegate;
@property (nonatomic, weak) id<NSObject> secondDelegate;
- (instancetype)initWithFirstDelegate:(id<NSObject>)firstDelegate secondDelegate:(id<NSObject>)secondDelegate;
@end
第二步:TableViewTowDelegate.m
#import "TableViewTowDelegate.h"
@implementation TableViewTowDelegate
- (instancetype)initWithFirstDelegate:(id)firstDelegate secondDelegate:(id)secondDelegate{
if(self = [super init]){
_firstDelegate = firstDelegate;
_secondDelegate = secondDelegate;
}
return self;
}
- (void)forwardInvocation:(NSInvocation *)anInvocation{
SEL aSelector = [anInvocation selector];
if([self.firstDelegate respondsToSelector:aSelector]){
[anInvocation invokeWithTarget:self.firstDelegate];
}
if([self.secondDelegate respondsToSelector:aSelector]){
[anInvocation invokeWithTarget:self.secondDelegate];
}
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector{
NSMethodSignature *first = [(NSObject *)self.firstDelegate methodSignatureForSelector:aSelector];
NSMethodSignature *second = [(NSObject *)self.secondDelegate methodSignatureForSelector:aSelector];
if(first){
return first;
}
else if(second){
return second;
}
return nil;
}
- (BOOL)respondsToSelector:(SEL)aSelector{
if([self.firstDelegate respondsToSelector:aSelector] || [self.secondDelegate respondsToSelector:aSelector]){
return YES;
}
else{
return NO;
}
}
@end
第三步:设置UITableView的代理
FirstViewController *firstDelegate=[[FirstViewController alloc]init];//这个控制器有实现<UITableViewDelegate>或<UIScrollViewDelegate>等等。
TableViewTowDelegate * twoDelegate = [[TableViewTowDelegate alloc] initWithFirstDelegate:firstDelegate secondDelegate:self];
UITableView *tableView=[[UITableView alloc]init];
tableView.delegate =twoDelegate;
[self.view addSubview:tableView];
当self没有实现UITableViewDelegate中的方法就会执行FirstViewController中实现的UITableViewDelegate的方法。