iOS 题库

1、UIView和CALayer的主要区别和联系

UIView基于UIKit框架,CALayer基于quartzCore框架,虽然都是对象,但是CALyaer直接继承UIResponder。也就是说,UIView可以进行事件的传递。
所以简单理解为:UIView是一个骨架,CALayer给它化妆。
其次,UIView的创建会自带一个layer属性,所以UIView也可以理解为一个CALyer的访问器,内部访问CALayer的相关属性。
最后,view显示在界面,view作为layer的delegate,view展示的内容时调用的layer方法返回。

2、iOS中Weak的底层实现原理

Runtime会维护一个weak表,用于维护指向对象的所有weak指针。weak是一个哈希表,其key为所指对象的指针,value为weak指针的地址数组。
具体过程如下:
1、初始时:runtime会调用objc_initWeak函数,初始化一个新的weak指针指向对象的地址。
2、添加引用时:objc_initWeak函数会调用objc_storeWeak函数,更新指针指向,创建对应的弱引用表。
3、释放时:调用clearDeallocating函数。clearDeallocating函数首先根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中的数据设为nil,最后把这个entry从weak表中删除,最后清理对象的记录。

3、iOS编译流程

源代码->预处理器->编译器->汇编->机器码->链接->可执行文件

  • iOS静态库与动态库
    静态库:链接时会被完整复制到可执行文件中,被多次使用就有多份拷贝
    动态库:链接时不复制,程序运行时由系统动态加载到内存,系统只加载一次,多个程序共用,节省内存

  • 内存优化

  • 检测内存问题的一般方法:
    1、静态检测方法
    2、动态检测方法 instruments
    3、dealloc
    4、第三方自动检测库

  • 判断对象要不要回收的唯一依据:引用计数是否为0

  • assign与weak都是弱引用类型,最大的区别在哪?
    weak 声明的变量对象释放后自动清空,赋值为nil,
    assign 声明的变量对象释放后不会自动赋值为nil,会造成野指针错误

内存管理

猜你喜欢

转载自blog.csdn.net/X_King_Q/article/details/113531055
ios