消息机制原理
消息机制原理图iOS进程是一个活的循环(runtime), OC中调用方法的实质就是发送消息, 而消息机制的本质就是对象根据方法编号SEL去映射表查找对应的方法实现;
另外, 类在一定意义上也是对象, 是一种特殊的对象, OC中的创建对象 [A alloc] 实质上就是向类对象发送 alloc 消息;
SEL
SEL是指向方法的指针, 它的作用就是加快找到方法的速度; 在开发中我们可以根据三种方法来获取SEL,如下:
1. runtime提供的 sel_registerName("char类型"); //将C字符串转化为SEL
2. OC提供的 @selector();
3. OC提供的 NSSelectorFromString(NSString *aSelectorName); //将OC字符串转换为SEL
Method
Method本质是一个结构体, 包含了SEL和IMP, 其实就是SEL和IMP做了一个映射!
objc_msgSend()
这是runtime提供的API, 我们平常写的调用函数最终都会被转换为消息, 而 objc_msgSend() 就是发送消息:
objc_msgSend(self, @selector(test:), @"发送消息");
第一个参数表示向谁发送消息, 第二个参数就是方法指针, 第三个参数为方法的参数, 方法还有参数就继续追加
演示
objc_msgSend(); 直接调用会在64位系统下偶尔发生cash, 文档 64-Bit Transition Guide for Cocoa Touch 推荐写法:
64_推荐写法可以看出, 在64位下, 先明确类型才是最安全的
//id view = [UIView alloc];
id view = ((id (*)(id, SEL))objc_msgSend) (objc_getClass("UIView"), sel_registerName("alloc"));
注: objc_getClass(获取类实例) 相当于 [UIView Class], sel_registerName 相当于 @selector()
//UIView *contentView = (UIView *)[view init];
UIView *contentView = (UIView *)((id(*)(id, SEL))objc_msgSend) (view, @selector(init));
//contentView.backgroundColor = [UIColor whiteColor];
((void(*)(UIView *, SEL, UIColor *))objc_msgSend) (contentView, @selector(setBackgroundColor:),[UIColor whiteColor]);
//contentView.frame = CGRectMake(100, 100, 100, 100);
((void(*)(UIView *, SEL, CGRect))objc_msgSend) (contentView, @selector(setFrame:), CGRectMake(100, 100, 100, 100));
//contentView.tag = 10;
((void(*)(UIView *, SEL, NSUInteger))objc_msgSend) (contentView, @selector(setTag:), 10);
//contentView.userInteractionEnabled = YES;
((void(*)(UIView *, SEL, BOOL))objc_msgSend) (contentView, @selector(setUserInteractionEnabled:), YES);
//[self.view addSubview:contentView];
((void(*)(UIView *, SEL, UIView *))objc_msgSend) (self.view, @selector(addSubview:), contentView);
网友评论