返回

iOS 面试题:内存管理问题大盘点

IOS

写在前面:

作为 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。
  • 定期清理未使用的对象。