返回
iOS 面试题:内存管理问题大盘点
IOS
2023-10-10 19:49:24
写在前面:
作为 iOS 开发者,内存管理是面试中必不可少的一环。为了帮助大家巩固复习,也分享给大家;希望对大家有所帮助!对于答案,不一定都合大家胃口,欢迎留言交流补充。
1. 什么是 ARC 和 MRC?
ARC (Automatic Reference Counting): iOS 5 引入的内存管理机制,由编译器自动管理对象的引用计数。
MRC (Manual Reference Counting): 需要手动管理对象引用的内存管理机制。
2. 什么是引用计数?
对象的引用计数记录着指向该对象的指针数量。当引用计数为 0 时,对象被释放。
3. autorelease 的作用是什么?
自动释放池在某个时间点自动释放对象。如果对象在被释放前被其他对象引用,它的引用计数会增加。
4. weak、strong、copy、retain、release 和 dealloc 的区别是什么?
- weak: 不会增加对象的引用计数,当对象被释放时,指向该对象的 weak 指针会被自动置为 nil。
- strong: 增加对象的引用计数。
- copy: 创建对象的副本,副本有自己的引用计数。
- retain: 增加对象的引用计数。
- release: 减少对象的引用计数,当引用计数为 0 时,对象被释放。
- dealloc: 对象被释放时调用的方法。
5. 什么是内存泄漏?如何发现?
内存泄漏是指不再使用的对象仍然被引用,导致内存无法被释放。可以通过工具如 Instruments 或 Xcode 的泄漏检测功能来发现。
6. 什么是循环引用?如何解决?
循环引用是指两个或多个对象相互引用,导致引用计数无法降为 0。可以使用 weak 引用或 __unsafe_unretained 来解决。
7. 什么是野指针?如何避免?
野指针是指指向已释放对象的指针。可以使用 __strong 修饰符来避免创建野指针。
8. 如何优化内存性能?
- 使用 ARC 而不是 MRC。
- 避免循环引用。
- 正确使用 retain、release 和 autorelease。
- 使用缓存来减少对象创建次数。
9. 缓存有哪些类型?
- 内存缓存
- 磁盘缓存
- 数据库缓存
10. 其他内存管理优化技巧
- 使用轻量级对象,例如 NSArray 而不是 NSMutableArray。
- 使用 lazy loading 来延迟对象加载。
- 使用轻量级容器,例如 NSDictionary 而不是 NSMutableDictionary。
- 定期清理未使用的对象。