iOS runtime入门级的举例

作者: 找不到好的ID | 来源:发表于2017-03-03 16:28 被阅读104次
    runtime.
    中文翻译:运行时刻.
    Objective-C是一门动态语言,运行时会转换成C语言.
    例如:[object method];(编译时) 
    转换成:objc_msgSend(object, @selector(method));(运行时)
    
    场景一:
     [btn addTarget:self action:@selector(click) forControlEvents:UIControlEventTouchUpInside];
    当你没写click方法的时候,编译的时候会提示找不到click方法.
    当你运行的时候,点击按钮,程序会崩溃.
    崩溃之前程序做了几件事情.
    1.在拥有btn类的方法缓存列表中找了一遍是否有这个方法(方法缓存简介:方法缓存是为了优化性能,而优化是永无止境的.链接:http://www.cocoachina.com/ios/20150818/13075.html)
    2.在拥有btn类的父类中查找一遍是否有该方法.
    3.在拥有btn类的根类中查找一遍是否有该方法.
    4.看是否有拦截调用的方法.
    
    123我们不考虑,4是runtime入门的一个点.
    + (BOOL)resolveInstanceMethod:(SEL)sel;
    

    这样点击,程序没有崩溃.
    假设程序响应命令是0转变为1的过程,我们知道了是可以在这个过程里做一些事情的.
    例如:交换点击事件(这样做并没有意义,只是举个例子),A按钮的点击却实现的B按钮的点击事件
    交换的原理是:交换指针指向
    运行时交换方法,有点像面向切面编程(动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程)
    但是我觉得交换方法特别容易乱,交换完要换回来,除非你打算交换完就不换回来,一直使用,不过那样就失去了交换的意义.

    建议大家看看Mattt Thompson(AFNetwoking的创作者/维护者)
    写的Method Swizzling:http://nshipster.cn/method-swizzling
    专门讲述了方法交换以及注意的点
    

    相关文章

      网友评论

        本文标题:iOS runtime入门级的举例

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