消息传递
缓存查找
哈希查找
在当前类中查找
对于已排序号的列表 采用二分查找算法查找方法对应执行函数
对于没有排序的列表,采用一般遍历查找方法对应执行函数
三种查找方式
缓存 -> 哈希算法查找
当前类 -> 已排序 二分查找算法 未排序 遍历
通过isa父类
消息转发
实例转发流程:
void testImp (void)
{
NSLog(@"test invoke");
}
+ (BOOL)resolveInstanceMethod:(SEL)sel
{
// 如果是test方法 打印日志
if (sel == @selector(test)) {
NSLog(@"resolveInstanceMethod:");
// 动态添加test方法的实现
class_addMethod(self, @selector(test), testImp, "v@:");
return YES;
}
else{
// 返回父类的默认调用
return [super resolveInstanceMethod:sel];
}
}
- (id)forwardingTargetForSelector:(SEL)aSelector
{
NSLog(@"forwardingTargetForSelector:");
return nil;
}
- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector
{
if (aSelector == @selector(test)) {
NSLog(@"methodSignatureForSelector:");
// v 代表返回值是void类型的 @代表第一个参数类型时id,即self
// : 代表第二个参数是SEL类型的 即@selector(test)
return [NSMethodSignature signatureWithObjCTypes:"v@:"];
}
else{
return [super methodSignatureForSelector:aSelector];
}
}
- (void)forwardInvocation:(NSInvocation *)anInvocation
{
NSLog(@"forwardInvocation:");
}
你