内存管理是一个十分重要的事情,稍有不慎就会发生内存泄漏或者是野指针的错误。内存泄漏一般表示没有任何指针指向的内存区域,由于这块内存在对象图中无法查找到,所以有可能永远都无法回收,如果内存泄漏的空间比较大,这对于应用程序的性能是有十分大的影响的,特别是IOS中这种内存空间十分有限的系统内。野指针一般表示一块已经被回收或重新分配的内存区域,通过野指针操作这块内存都有可能引发无法预测的错误。
那么如何正确的分配和释放内存是开发一款高性能的APP的一个重要方面。
Apple官方定义了一套规范来约定我们开发中的一些内存管理原则。IOS中,Foundation(基于Objective-C)和Core Foundation(基于C语言)有着不同的规范。下面列举在ARC和MRC的两种环境下的编码规则。
一、Foundation中的内存管理原则
若方法名以:alloc/new/copy/mutablecopy 开头
1、MRC
调用者需要负责释放(release)方法所返回的对象
2、ARC
编译器在编译阶段会自动根据上述规定来生成释放(release)方法。程序员无须手动释放,其实也不能调用释放相关方法,编译器会报错。
二、Core Foundation中的内存管理原则
若方法名中 带有 :create/copy/new/retain字眼,这个时候情况和Foundation中不一样,无论是ARC还是非ARC,我们都需要调用对应方法来释放对象例如:
CFRelease(xxx);来释放Core Foundation对象。值得注意的是,我们使用CoreGraphics绘图框架, CGPathCreateMutable()也需要遵守上述原则,因为CoreGraphics是基于Core Foundation的。
其实有时候也不需要死记到底要不要release,只要方法名满足上述要求,下面自觉调用release,编译器报错就说明这件事,编译器已经帮我们做了,我们不需要再做释放操作。当然这仅仅是一种非常规手段,个人只要牢记:编码和做人一样,都应该负起责任,你既然创建了它,就有责任释放它,你既然告诉系统你想使用它,那你也有责任去释放它,我们既然把它带到这个世界,就不能放任不管,那样简直天理难容。好吧,扯远了!有关于内存管理中的几个常见关键字(strong/weak/retain/assign/copy/unsafe_unretained)的意义,有时间再从为知笔记上整理过来。