zoukankan      html  css  js  c++  java
  • iOS面试题04-runtime

    runtime/KVO等面试题

    1.KVO内部实现原则

    回答:1>KVO是基于runtime机制实现的

       2>当某个类的对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter方法。

    派生类在被重写的setter方法实现真正的通知机制(Person->NSKVONOtifying Person)

     Person类对象p设置self控制器且设置监听属性,就会调用observeValueForKeyPath方法,当Person类的属性被改变时,就会动态生成一个子类继承自Person类(NSKVONotifying_Person),重写setAge方法,内部调用父类setAge方法,通知监听器

    [监听器  observeValueForKeyPath:@"age" ofObject:self change:@{} context:(void *)context];

    原先age属性不改变时p对象 isa指向Person,当age属性改变时p对象 isa指向NSKVONotifying_Person(setAge重新内部就会传递变量至父类且通知监听器age属性改变)

    2.是否可以把比较耗时的操作放在NSNotificationCenter中

    回答:1>如果在异步发送通知,那么可以执行比较耗时的操作

            2>如果在主线程发送通知,那么就不可以执行比较耗时的操作

     图--2

    图---1

    3.Foundation对象与Core Foundation对象有什么区别

    回答:1>Foundation对象是OC的,Core Foundation是C语言对象

             2>Foundation对象和Core Foundation对象可以互相转换的,数据类型之间的转换

         ARC:__bridge_retained/__bridge_transfer

       非ARC:__bridge

    4.不用中间变量,用两种方法交换A和B

    回答:A= A + B

           B= A -B

          A = A - B

         或者

        A= A^B

       B = A ^ B

       A = A^B;

    5.简单描述下对单例模式设计的理解?

    回答:节省内存资源,一个应用就一个对象

    6.什么是动态,举例说明

    1>在程序运行过程才执行的操作,例如KVO的内部实现原理,一个类的属性值随着程序运行监听属性值的变化

    7.runtime实现机制是什么,怎么用,一般用于嘛,你还能记得你所使用的相关头文件或者某些方法的名称吗?

    回答:运行时机制,runtime库里面包含了跟类/成员变量/方法相关的API,比如获取类里面的所有成员变量,为类动态添加成员变量,动态改变类的方法实现,为类动态添加新的方法等,需要导入<objc/message.h><objc/runtime.h>

    1>runtime,运行时机制,它是一套C语言库

    什么是runtime?

    2>实际上我们编写的所有OC代码,最终都是转成了runtime库的东西,比如类转成了runtime库里面的结构体等数据类型,方法转成了runtime库里面的C语言函数,平时调方法都是转成了objc_msgSend函数(所以说OC有个消息发送机制)

    3>因此,可以说runtime是OC的底层实现,是OC的幕后执行者

    runtime有啥用?

    1>能动态产生一个类、一个成员变量、一个方法

    2>能动态修改一个类、一个成员变量、一个方法

    3>能动态删除一个类、一个成员变量、一个方法

    常见的函数、头文件

    #import <objc/runtime.h> : 成员变量、类、方法

    class_copyIvarList : 获得某个类内部的所有成员变量

    class_copyMethodList : 获得某个类内部的所有方法

    class_getInstanceMethod : 获得某个具体的实例方法(对象方法,减号开头)

    class_getClassMethod : 获得某个具体的类方法 (加号)

    method_exchangeImplementations : 交换2个方法的实现

    #import <objc/message.h> 消息机制

    objc_msgSend(...);

    图解:平时用OC代码设置变量值都转成如下图所示

      

    图解:runtime机制可以看到很底层的实现,甚至成员变量是私有的。

    图解:runtime实现遍历所有成员变量

     图解:使用runtime机制,UIImage类交换2个方法的实现(imageWithName和imageNamed)

    但是如果在imageWithName方法内在调用imageNamed就会导致死循环。

    交换2个方法的好处:以后一个大项目当中的一个方法使用过多,想动一些手脚和操作,就可以很方便实现。

    图解:修改addObject方法不为空才添加到数组

    图解:修改objectAtIndex方法并查看是否越界,如越界返回null,runtime还可防止程序崩溃

    附注:self.book[4]执行实际调用objectAtindex方法。

  • 相关阅读:
    JID 2.0 RC4 发布,高性能的 Java 序列化库
    FBReaderJ 1.6.3 发布,Android 电子书阅读器
    Arquillian 1.0.3.Final 发布,单元测试框架
    JavaScript 的宏扩展 Sweet.js
    Hypertable 0.9.6.5 发布,分布式数据库
    JRuby 1.7.0 发布,默认使用 Ruby 1.9 模式
    httppp 1.4.0 发布,HTTP响应时间监控
    Redis 2.6.0 正式版发布,高性能K/V服务器
    OfficeFloor 2.5.0 发布,IoC 框架
    XWiki 4.3 首个里程碑发布
  • 原文地址:https://www.cnblogs.com/linmingjun/p/4787770.html
Copyright © 2011-2022 走看看