美文网首页
iOS开发 — 初识消息机制

iOS开发 — 初识消息机制

作者: __life__ | 来源:发表于2017-10-30 15:22 被阅读0次

    消息机制原理

    消息机制原理图

    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);

    相关文章

      网友评论

          本文标题:iOS开发 — 初识消息机制

          本文链接:https://www.haomeiwen.com/subject/huwppxtx.html