ios面试题1

作者: 大鹅ne | 来源:发表于2020-06-22 15:38 被阅读0次

    1.一个NSObject对象占用了多少内存?
    系统分配了16个字节给NSObject对象(通过malloc_size函数获得)
    NSObject对象内部只占用了8个字节(64bit环境下,可以通过class_getInstanceSize函数获得)

    2.对象的isa指针指向哪里?
    instance对象的isa指针指向class对象
    class对象的isa指针指向meta-class对象
    meta-class对像的isa指针指向基类的meta-clas对象

    3.OC类信息存放在哪里?
    对像方法,属性,成员变量,协议信息,存放在class对象中
    类方法存放在meta-class对象中
    成员变量的具体值,存放在instance对象

    4.ios用什么方式实现对一个对象的KVO?(KVO的本质是什么?)
    利用runtimeAPI自动生成一个子类,并让isa指针指向这个全新的子类
    当修改instance对象的属性时,会调用Foundation的_NSSetXXXXValueAndNotify函数
    *willChangeValueForKey:
    *父类原来的setter
    *didChangeValueForKey:
    内部会触发监听器(oberser)的监听方法observeValueForKeyPath:ofObject:change:context:

    5.如何手动触发KVO?
    手动调用willChangeValueForKey:和didChangeValueForKey:

    6.直接修改成员变量会触发KVO么?
    不会触发KVO

    7.通过KVC修改属性会触发KVO吗?
    会触发KVO

    8.kvc的赋值和取值过程是什么样的,原理是什么?

    9.Category的实现原理?
    Category编译之后的底层结构是struct category_t,里面存储着分类的对象方法,类方法,属性,协议信息
    在程序运行的时候,runtime会将Category的数据,合并到类信息中(类对象,元类对象中)

    1. Category和Class Extension的区别是什么?
      Class Extension在编译的时候,它的数据就已经保存在类信息中
      Category试运行时才会把类合并到类信息中

    2. Category有load方法吗?load方法是什么时候调用的?load能实现继承吗?
      有load方法
      load方法在runtime加载类,分类时候调用
      load可以继承,但一般情况下不会主动去调用load方法,都是让系统自动去调用

    12.load和initialize方法的区别是什么?它们在Category的调用顺序?以及出现继承时它们之间的调用过程?

    1. Category能否添加成员变量?如果可以,如何给Category添加成员变量?
      不可以直接给Category添加成员变量,但可以间接实现Category有成员变量的效果

    14.block的原理是怎样的?本质是什么?
    封装了调用函数以及调用环境的OC对象

    15.__block的作用是什么?有什么使用注意点?

    1. block的属性修饰词为什么是copy,使用blcok时要注意哪些?
      blcok没有copy操作,就不会在堆上
      使用注意:循环引用问题

    17.block在修改NSMutableArray时,需不需要添加__block?

    相关文章

      网友评论

        本文标题:ios面试题1

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