在iOS开发面试中,了解和掌握技术细节是至关重要的。以下是一些常见的面试知识点,主要涉及SDWebImage的缓存策略、预处理指令的区别、内存管理关键字的理解、数据结构的区别、KVC和KVO的工作机制,以及Objective-C的Runtime。
1. **SDWebImage缓存策略**:
SDWebImage是一个流行的iOS图片下载和缓存库。它的缓存策略包括内存缓存和磁盘缓存。它会在内存中查找图片,如果找不到,会基于图片URL的MD5哈希值在磁盘缓存中查找。如果图片依然不存在,SDWebImage会在后台线程下载图片,下载完成后,将图片加载到UIImageView并将其存储到内存和磁盘缓存中,以便后续快速访问。
2. **预处理指令的区别**:
- `#include`:在C语言中,用于引入头文件,可能导致重复导入。
- `#import`:在Objective-C中,它引入头文件并防止重复导入,可以避免头文件递归导入的问题。
- `@class`:仅声明类的存在,告知编译器有这么一个类,但不包含实际实现,通常在不需要完整头文件的情况下使用。
3. **weak关键字的使用**:
- `weak`:在ARC环境下,主要用于解决循环引用问题,如代理属性或自定义IBOutlet属性。当所引用的对象被销毁时,weak属性会自动设置为nil,避免野指针问题。
- `assign`:不参与引用计数,适用于非Objective-C对象,若对象销毁后仍指向该地址,可能导致野指针和程序崩溃。
4. **结构体与数组的区别**:
- 结构体可以包含不同类型的数据成员,而数组只能存储相同类型的数据。
- 结构体需要用户自定义,数组由元素类型和数量定义。
- 结构体的内存分配遵循对齐原则,可能不是所有成员大小的总和,而数组则是连续的内存空间。
- 结构体可以通过箭头操作符`.`或`->`访问成员,数组则需通过索引访问。
5. **KVC赋值和取值过程**:
KVC通过键来访问对象的属性。如果找到对应的setter方法,就直接赋值;否则,尝试通过实例变量访问。如果允许,KVC会尝试多种方法来访问和修改属性值。
6. **KVO实现方式**:
KVO(Key-Value Observing)利用Runtime动态创建子类,改变对象的isa指针。当属性变更时,会调用一系列通知方法,触发观察者的方法。
7. **手动触发KVO**:
可以通过调用`willChangeValueForKey:`和`didChangeValueForKey:`方法来手动触发KVO通知。
8. **KVC修改属性与KVO**:
通过KVC修改属性时,会自动触发KVO机制,因为KVC内部会调用相应的setter方法,从而通知观察者。
9. **KVC赋值和取值原理**:
KVC通过键来访问对象的属性,尝试调用`setValue:forKey:`、`set<Key>:`等方法,若找不到合适的方法,会尝试其他手段如访问实例变量。
10. **Runtime**:
Objective-C的Runtime是一个运行时库,它实现了Objective-C的动态特性,如消息传递、类别、协议、反射等。在项目中,Runtime常用于动态方法解析、分类、交换方法、KVO等高级功能。
以上知识点涵盖了iOS开发中的多个重要概念,理解并掌握这些内容对于面试和实际开发都有极大的帮助。在面试中,能够深入地讨论这些话题将展示出扎实的技术基础。