【iOS】内存管理
内存管理直接决定程序的安全性和稳定性。核心要点包括:循环引用、内存泄露、内存管理规则、垃圾回收机制。Objective-C使用ARC(Automatic Reference Counting)作为内存管理机制,在代码中自动加入了retain和release,原来需要手动retain为对象获取内存并且release释放内存的操作被简化了。ARC和GC(Garbage Collection)的区别在于:ARC在编译时管理内存,GC在运行时管理内存,可以解决retain cycle。
什么时候会出现循环引用
循环引用是指俩个或者两个以上的对象相互强引用,导致所有对象无法自动释放的现象。解决办法是将其中一个对象的属性由strong改为weak。
什么是内存泄漏
内存泄漏是指动态分配内存的对象在使用后没有被系统回收,导致该对象始终占用内存而又无法被访问。大量的内存泄漏会导致系统内存不足,安全释放对象要在dealloc后将其指针置为nil。内存泄漏可以用Xcode中的Debug Memory Graph检查,同时Xcode也会在Runtime中自动汇报内存泄漏的问题。
僵尸对象
一个引用计数为0的Objective-C对象被释放后就成为僵尸对象。其内存已经被回收,随时可能被新对象申请占用。
野指针
野指针又叫悬挂指针,野指针出现的原因可能是指针没有赋值或者指向的对象已经被释放。野指针指向一块随机的内存垃圾,不能被访问。
空指针
空指针是一个没有任何内容的有效指针,值为nil、NULL、Nil或者0。避免野指针应该及时将其置为空指针。
垃圾回收机制
垃圾回收机制是程序中用来处理废弃不用等内存对象的机制,防止内存中废弃对象过多造成内存泄漏。Objective-C在MacOS平台支持垃圾回收,而在iOS平台采用引用计数来管理内存的分配与释放。垃圾回收机制是宏观的,它将所有对象看作一个集合,在GC循环中检测活动对象和非活动对象,及时释放非活动对象来避免内存泄漏;引用计数机制是局部的,开发者需要管理每个对象的引用计数,单个对象引用计数为0后被释放。