美文网首页
iOS开发 基础三

iOS开发 基础三

作者: 喜剧收尾_XWX | 来源:发表于2021-01-07 19:32 被阅读0次

    1.block为什么使用copy关键字

    • block是一个特殊的oc对象,建立在栈上,而不是堆上,这么做一个是为性能考虑,还有就是方便访问局部变量。
    • 默认Block使用到的局部变量会被copy,而不是retain。所以,他无法改变局部变量的值。如果在变量前加上__block那么编译器不会复制变量,而是去找变量的地址,通过地址来访问变量,实际上就是直接操作变量。
    • 另外block是在栈上分配的,所以一旦离开作用域,就会释放。因此要把block用在别处时,必须要copy一份。block不能保留,retain没有意义。

    2.load和initialize区别

    • 调用时刻:load是在pre-main阶段调用,且只会调用1次。initialize是在类第一次接受到消息(被调用)时调用(main函数之后),每个类只会initialize一次(父类的initialize会被调用多次。不冲突,子类没有,就调用父类的)
    • 调用顺序: 父类的load -> 子类的load -> 分类的load,initialize先初始化父类->再初始化子类
    • 实际使用: load方法一般用于方法交换,initialize方法一般用于初始化全局变量或静态变量。
    • load和initialize方法内部使用了锁,因此它们是线程安全的。实现时要尽可能保持简单,避免阻塞线程,不要再使用锁。

    https://zhuanlan.zhihu.com/p/270024733

    2.kvc的实现原理

    https://blog.csdn.net/wtdask/article/details/84881477

    3.常用的设计模式

    • 代理
    • KVO
    • 单例
    • mvc、mmvm

    4.分类和扩展之间的区别

    (1)Category

    • 不可以添加属性,需要通过runtime添加属性。
    • 如果分类中有和原有类同名的方法, 会优先调用分类中的方法, 就是说会忽略原有类的方法。所以同名方法调用的优先级为 分类 > 本类 > 父类。因此在开发中尽量不要覆盖原有类
    • 如果多个分类中都有和原有类中同名的方法, 那么调用该方法的时候执行谁由编译器决定;编译器会执行最后一个参与编译的分类中的方法

    (2)Extension

    • Extension是Category的一个特例。类扩展与分类相比只少了分类的名称,所以称之为“匿名分类”。一般写在.m文件中,用来扩展私有属性和方法。
    • 定义在 .m 文件中的类扩展方法为私有的,定义在 .h 文件(头文件)中的类扩展方法为公有的。类扩展是在 .m 文件中声明私有方法的非常好的方式。

    (3)区别

    • Category只可以添加方法,Extension可以添加属性和方法。
    • Extension只能用于自身类,而不能用于子类或者其他地方。
    • Extension中声明的方法必须要实现,否则编译器警告。Category不会。这是因为Extension是编译阶段被添加到类中,Category是运行时被添加到类中。

    5.代理、通知、block的区别

    • 通知是一对多,很多控制器想要知道一个事件
    • 代理一对一,注重过程的回调,如webview的加载 ,将要加载、开始加载、加载完成、加载错误都是通过代理回调。
    • block一对一,相比代理语法更加简洁。更注重结果的回调的结果。同时要注意循环引用。

    相关文章

      网友评论

          本文标题:iOS开发 基础三

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