• ios面试准备 - objective-c篇


    iOS面试准备 - ios篇
    ios面试准备 - objective-c篇
    ios面试准备 - 网络篇
    IOS面试准备 - C++篇
    iOS面试准备 - 其他篇

    Swift与oc区别

    Swift和Objective-C共用一套运行时环境,Swift的类型可以桥接到Objective-C(下面我简称OC),反之亦然。

    Swift优点
    Swift容易阅读,语法和文件结构简易化。
    Swift更易于维护,文件分离后结构更清晰。
    Swift更加安全,它是类型安全的语言。
    Swift代码更少,简洁的语法,可以省去大量冗余代码
    Swift速度更快,运算性能更高。

    Swift缺点
    使用的人没有oc多(现在不明显了)
    因为语言转换的成本 很多公司继续沿用oc

    KVC

    KVC是由NSKeyValueCoding非正式协议启用的一种机制,对象采用该协议提供对其属性的间接访问。
    ios13禁止kvc访问私有属性。

    kvc设值
    设值就是调用函数:setValue:forKey,内部流程如下:
    首先会调用对应setter方法,setkey、_setKey、setIsKey,如果没有,
    检查accessInstanceVariablesDirectly方法是否返回YES,如果NO直接去setValue:forUndefinedKey:方法。如果为YES,
    依次搜索成员变量 _key,_isKey,key,isKey 。如果找到就给他赋值,否则调用setValue:forUndefinedKey:
    setValue:forUndefinedKey: 默认抛出异常

    如果不想crash可以弄个NSObject的分类,重写setValue:forUndefinedKey: 做个空实现。

    kvc取值
    取值就是调用 valueForKey: ,内部流程如下:

    ●首先getter方法,getKey、key、isKey、_key 找到的话会直接调用。如果是BOOL或者Int等值类型,会将其包装成一个NSNumber对象。

    ● 检查类方法+ (BOOL)accessInstanceVariablesDirectly,如果返回YES(默认行为),那么和先前的设值一样,会按_key,_isKey,key,isKey的顺序搜索成员变量名的顺序搜索成员变量名。
    ● 如果还没找到,直接调用该对象的valueForUndefinedKey:方法,该方法默认是抛出异常。

    KVO

    iOS用什么方式实现对一个对象的KVO?(KVO的本质是什么?)
    答. 当一个对象使用了KVO监听,iOS系统会修改这个对象的isa指针,改为指向一个全新的通过Runtime动态创建的子类,子类拥有自己的set方法实现,set方法实现内部会顺序调用willChangeValueForKey方法、原来的setter方法实现、didChangeValueForKey方法,而didChangeValueForKey方法内部又会调用监听器的observeValueForKeyPath:ofObject:change:context:监听方法。

    如何手动触发KVO?
    答. 被监听的属性的值被修改时,就会自动触发KVO。如果想要手动触发KVO,则需要我们自己调用willChangeValueForKey和didChangeValueForKey方法即可在不改变属性值的情况下手动触发KVO,并且这两个方法缺一不可,触发代码还是在他们两者之间。

    其他

    iOS:弄懂OC中的类与元类:
    https://www.jianshu.com/p/51b4019a8df2

    il、Nil、NULL、NSNull的区别
    nil:指向一个对象的空指针,对objective c id 对象赋空值.
    Nil:指向一个类的空指针,表示对类进行赋空值.
    NULL:指向其他类型(如:基本类型、C类型)的空指针, 用于对非对象指针赋空值.
    NSNull:在集合对象中,表示空值的对象.

    try中return
    在try里面return,finally会在return之后执行,所以这种情况下finally里面处理返回值会出问题,所以不要把return放try里面。

    自增问题
    下面两种方式,count的值都不会变。原理:count这个值0暂存起来,然后count自加1变成1,最后将暂存的值赋值给count,count最终的值为0

    int count = 0;
    count = (count++);
    count = count++;
    
    • 1
    • 2
    • 3

    下面那样值会加一

    count = ++count;
    
    • 1
  • 相关阅读:
    Java Stream流对List集合进行分页
    Android AMS——概述(一)
    java-net-php-python-SSM的美工接单系统计算机毕业设计程序
    100天精通Python(基础篇)——第13天:对表达式进行格式化
    Linux系统配置及服务管理-07-文件系统及RAID
    产品市场研究的方法有哪些
    【LeetCode-中等题】 222. 完全二叉树的节点个数
    MogaFX提供查看即时结果的机会
    python装饰器的使用方法
    git根据文件改动将文件自动添加到缓冲区
  • 原文地址:https://blog.csdn.net/htwhtw123/article/details/125483868