黑马程序员——OC的内存管理学习小结

      内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样。

      虽然作为一门高级语言,但OC却没有内存回收机制。这就需要开发者来对动态内存进行管理。OC中内存管理的范围是:任何继承了NSObjective的对象,对基本数据类型是无效的。这和它的管理原理有关。

     每个对象内部都保存了一个与之关联的整数,称为引用计数器,当使用alloc、new、或copy创建一个对象时,对象的引用计数器被设置为1.给对象发送一条retain信息,可以使引用计数器的值加1,给对象发送一条release信息,可以使引用计数器值减1.当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存将被系统回收,OC也会自动向对象发一条dealloc消息。一般情况下开发者会重写dealloc方法,在这里释放相关资源。一定不要直接调用dealloc方法。要注意的是要重写dealloc方法时要在实现里最后调用

[super dealloc]方法。若重复使用release释放某块内存,可能会发生野指针错误,即使用一个指向僵尸对象的指针进行操作,这样是危险的。

      一般来说内存管理有这样的一个原则:谁创建谁释放(”谁污染,谁治理“)。如果你通过alloc、new或(mutable)copy来创建一个对象,那么你必须调用 release或autorelease来释放该内存空间,还有就是不是你创建的,就不用你去释放。一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease,放进autoreleasepool里就行了。换句话说,谁retain,谁release。只要你调用了retain无论这个对象是如何生成的你都要调用release释放。

      关于自动释放池autorelease pool。是OC中一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中统一回收释放。当自动释放池销毁时,池里的所有对象都会调用一次release方法,这里要注意的是,调用一次release方法的是指计数器值将减1,并不一定回收内存;OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中,即栈顶的释放池。实际上autorelease只是把对release的调用延迟了,对于每一次调用,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时该pool中的所有对象会被调用release。

      Autorelease pool要注意的是,在ARC下不能使用[[NSAutoreleasePool alloc] init]而应当用@autoreleasepool。不要把大量循环操作放到同一个NSAutoreleasePool之间这样会造成内存峰值上升。尽量避免对大内存使用该方法,对于这种延迟释放机制,还是尽量少用。sdk中一般利用静态方法创建并返回的对象都是已经autorelease的不需要进行release操作。

原文地址:https://www.cnblogs.com/newbee010/p/4338451.html