美文网首页
iOS interview

iOS interview

作者: SamCheck | 来源:发表于2018-08-02 10:46 被阅读8次

    对block理解 ?

    block对变量的赋值

    static CGFloat tmp3;
    @implementation ViewController
    - (void)func {
        __block CGFloat tmp1 ;
    __block CGFloat tmp2 ;
        void(^block)(void) = ^void(){
            tmp1 = 30;
            tmp2 = 40;
            tmp3 = 50;
        };
        block();
    }
    @end
    

    对@property属性里面修饰符的理解?

    1.原子性--- nonatomic 特质
    2.读/写权限---readwrite(读写)、readonly (只读)
    3.内存管理语义---assign、strong、 weak、unsafe_unretained、copy
    4.方法名---getter=<name> 、setter=<name>
    5.不常用的:nonnull,null_resettable,nullable

    1). readwrite 是可读可写特性。需要生成getter方法和setter方法。
    2). readonly 是只读特性。只会生成getter方法,不会生成setter方法,不希望属性在类外改变。
    3). assign 是赋值特性。setter方法将传入参数赋值给实例变量;仅设置变量时,assign用于基本数据类型
    4). retain(MRC)/strong(ARC) 表示持有特性。setter方法将传入参数先保留,再赋值,传入参数的retaincount会+1
    5). copy 表示拷贝特性。setter方法将传入对象复制一份,需要完全一份新的变量时。
    6). nonatomic 非原子操作。决定编译器生成的setter和getter方法是否是原子操作,atomic表示多线程安全,一般使用nonatomic,效率高。

    #import#include@class 有什么区别?

    #import是Objective-C导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入。
    #include是C/C++导入头文件的关键字。
    @class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含。

    KVO实现原理?

    KVO基本原理:

    1.KVO是基于runtime机制实现的。
    2.当某个类的属性对象第一次被观察时,系统就会在运行期动态地创建该类的一个派生类,在这个派生类中重写基类中任何被观察属性的setter 方法。派生类在被重写的setter方法内实现真正的通知机制。
    3.如果原类为Person,那么生成的派生类名为NSKVONotifying_Person。
    4.每个类对象中都有一个isa指针指向当前类,当一个类对象的第一次被观察,那么系统会偷偷将isa指针指向动态生成的派生类,从而在给被监控属性赋值时执行的是派生类的setter方法。
    5.键值观察通知依赖于NSObject 的两个方法: willChangeValueForKey: 和 didChangevlueForKey:;在一个被观察属性发生改变之前, willChangeValueForKey:一定会被调用,这就 会记录旧的值。而当改变发生后,didChangeValueForKey:会被调用,继而 observeValueForKey:ofObject:change:context: 也会被调用。

    KVO深入原理:

    1.Apple 使用了 isa 混写(isa-swizzling)来实现 KVO 。当观察对象A时,KVO机制动态创建一个新的名为:?NSKVONotifying_A的新类,该类继承自对象A的本类,且KVO为NSKVONotifying_A重写观察属性的setter?方法,setter?方法会负责在调用原?setter?方法之前和之后,通知所有观察对象属性值的更改情况。
    2.NSKVONotifying_A类剖析:在这个过程,被观察对象的 isa 指针从指向原来的A类,被KVO机制修改为指向系统新创建的子类 NSKVONotifying_A类,来实现当前类属性值改变的监听;
    3.所以当我们从应用层面上看来,完全没有意识到有新的类出现,这是系统“隐瞒”了对KVO的底层实现过程,让我们误以为还是原来的类。但是此时如果我们创建一个新的名为“NSKVONotifying_A”的类(),就会发现系统运行到注册KVO的那段代码时程序就崩溃,因为系统在注册监听的时候动态创建了名为NSKVONotifying_A的中间类,并指向这个中间类了。
    4.(isa 指针的作用:每个对象都有isa 指针,指向该对象的类,它告诉 Runtime 系统这个对象的类是什么。所以对象注册为观察者时,isa指针指向新子类,那么这个被观察的对象就神奇地变成新子类的对象(或实例)了。)?因而在该对象上对 setter 的调用就会调用已重写的 setter,从而激活键值通知机制。
    5.子类setter方法剖析:KVO的键值观察通知依赖于 NSObject 的两个方法:willChangeValueForKey:和 didChangevlueForKey:,在存取数值的前后分别调用2个方法: 被观察属性发生改变之前,willChangeValueForKey:被调用,通知系统该 keyPath?的属性值即将变更;当改变发生后, didChangeValueForKey: 被调用,通知系统该 keyPath?的属性值已经变更;之后,?observeValueForKey:ofObject:change:context: 也会被调用。且重写观察属性的setter?方法这种继承方式的注入是在运行时而不是编译时实现的。

    KVO

    对业务埋点的理解?

    iOS无埋点数据SDK实践之路
    iOS无埋点数据SDK的整体设计与技术实现
    iOS无埋点SDK 之 RN页面的数据收集

    项目组件化理解?

    1. 为什么用组件化?
    2. 组件化架构设计?
    3. 组件化需要考虑到哪些影响因素?

    相关文章

      网友评论

          本文标题:iOS interview

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