运行时(Runtime)

作者: Kevin_wzx | 来源:发表于2016-04-29 21:29 被阅读94次

    1.概念

    作为一门动态编程语言,Objective-C 会尽可能的将编译(动态加载)和链接(动态绑定)时要做的事情推迟到运行时。这意味着 Objective-C 语言不仅需要一个编译环境,同时也需要一个运行时系统来执行编译好的代码。运行时它是苹果提供的纯C语言的开发库(是一种非常牛逼、开发中经常用到的底层技术)

    2.运行时的作用

    屏幕快照 2017-01-16 上午10.20.05.png

    3.例子:运行时获取成员变量名称

    代码分析:

    #import <Foundation/Foundation.h>
    #import "XMGPerson.h"
    #import <objc/runtime.h>
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // 成员变量的数量
            unsigned int outCount = 0;
    
            // 获得所有的成员变量
            // ivars是一个指向成员变量的指针
            // ivars默认指向第0个成员变量(最前面)
            Ivar *ivars = class_copyIvarList([XMGPerson class], &outCount);
    
            // 遍历所有的成员变量
            for (int i = 0; i<outCount; i++) {
                // 取出i位置对应的成员变量
    //            Ivar ivar = *(ivars + i);
                Ivar ivar = ivars[i];
                // 获得成员变量的名字
                NSLog(@"%s", ivar_getName(ivar));
            }
    
            // 如果函数名中包含了copy\new\retain\create等字眼,那么这个函数返回的数据就需要手动释放
            free(ivars);
    
    //        Ivar ivar = *ivars;
    //        Ivar ivar2 = *(ivars + 1);
    //        NSLog(@"%s %s", ivar_getName(ivar), ivar_getName(ivar2));
    
    
            // 一个Ivar就代表一个成员变量
    
            // int *p; 指向int类型的变量
            // Ivar *ivars; 指向Ivar类型的变量
        }
        return 0;
    }
    

    获取UITextFiled成员变量的名称

    831339-6e0b3108f4104f85.png 屏幕快照 2017-01-16 上午10.22.36.png

    4.基础

    1.动态的类型
    2.动态的绑定
    3.动态的加载

    OC的编译与运行

    1.开始的代码阶段2.点击编译之后先执行预编译和去掉一些注释,然后才是进行编译。3.编译成功之后就开始运行,消息只有到运行时才会和函数实现绑定起来,而不是按照编译好的逻辑一成不变的执行。按照我的理解,编译阶段只是确定了要去向receiver对象发送message消息,但是却没有发送,真正发送是等到运行的时候进行。因此,编译阶段完全不知道message方法的具体实现,甚至,该方法到底有没有被实现也不知道。这就有可能导致运行时崩溃问题。4.-isMemberOfClass: 是 NSObject 的方法,用以确定某个 NSObject 对象是否是某个类的成员。与之相似的为 -isKindOfClass:,可以用以确定某个对象是否是某个类或其子类的成员。这两个方法为典型的introspection方法。在确定对象为某类成员后,可以安全地进行强制转换,继续之后的工作。

    验证某个类是否遵循协议也可以用conformsToProtocol

    // 重点: 通过协议实现委托回调 
    // 视图做不了的事情通过一个协议指针委托视图控制器来完成 
    if ([_delegate conformsToProtocol:@protocol(CDDetailViewDelegate)]) { 
    [_delegate detailView:self photoButtonClickedAtIndex:sender.tag - kPhotoButtonTagStartValue];
     }
    

    链接:http://blog.csdn.net/wzzvictory/article/details/8615569

    单词:
    1.receiver:接收器
    2.meta: 元
    3.dynamic: 动态的
    4.conforms: 符合
    5.resolve:决定

    5.iOS底层

    屏幕快照 2017-01-16 上午10.24.27.png 屏幕快照 2017-01-16 上午10.24.40.png 屏幕快照 2017-01-16 上午10.24.54.png 屏幕快照 2017-01-16 上午10.25.56.png 屏幕快照 2017-01-16 上午10.26.08.png
    - (void)parseObject:(id)object {
        for (id data in object) {
            if ([[data type] isEqualToString:@"String"]) {
                [self parseString:[data value]];
            } else if ([[data type] isEqualToString:@"Number"]) {
                [self parseNumber:[data value]];
            } else if ([[data type] isEqualToString:@"Array"]) {
                [self parseArray:[data value]];
            }
        }
    }
    - (void)parseObjectDynamic:(id)object {
        for (id data in object) {
            [self performSelector:NSSelectorFromString([NSString 
            stringWithFormat:@"parse%@:", [data type]]) withObject:
            [data value]];
        }
    }
    - (void)parseString:(NSString *)aString {}
    - (void)parseNumber:(NSString *)aNumber {}
    - (void)parseArray:(NSString *)aArray {}
    

    可一看到,你可以把7行带if的代码变成1行。将来如果有新的类型,只需增加实现方法即可,而不用再去添加新的 else if。

    屏幕快照 2017-01-16 上午10.29.36.png 屏幕快照 2017-01-16 上午10.29.59.png 屏幕快照 2017-01-16 上午10.30.17.png 屏幕快照 2017-01-16 上午10.30.28.png 屏幕快照 2017-01-16 上午10.30.41.png

    ios中Runtime的介绍以及使用
    http://www.jianshu.com/p/595e4c63c732
    http://www.jianshu.com/p/add581f0e8bb#

    相关文章

      网友评论

      本文标题:运行时(Runtime)

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