iOS 内存管理初识

iOS中常用内存管理分为2种,ios5以前是MRC(手动管理),ios5以后是ARC(自动管理)。

什么是引用计数:
引用计数(Reference Count)是一个简单而有效的管理对象生命周期的方式。

MRC:
需要遵循“谁创建,谁释放,谁引用,谁管理”,当创建或引用一个对象的时候,就需要向对象发送retain,alloc,copy等消息,当对象释放的时候,就需要向对象发送release,Autorelease等消息,此时对象不会被销毁,只有当对象的引用计数为0的时候,系统就会释放该对象。

ARC:
和MRC管理机制一样,只是ARC不需要手动发送alloc,tetain等消息,它引用的是strong,weak,autoreleasing,unsafe_unretained修饰符。
strong:强引用,持有所指对象的所有权,无修饰符情况下的默认值。类似于MRC下来的retain,引用计数加1。
weak:弱引用,不持有所指向对象的所有权,引用指向的对象内存被回收之后,引用本身会自动置nil,避免野指针。类似MRC下的assign,不增加引用计数,对比assign的好处,对象内存被回收后会自动置nil,而assign修饰的对象会出现野指针。

__unsafe_unretained:为兼容iOS5以下版本的产物,可以理解成MRC下的weak,现在基本用不到。

@autoreleasepool使用场景如下:

  • 写基于命令行的的程序时,就是没有UI框架,如AppKit等Cocoa框架时。
  • 写循环,循环里面包含了大量临时创建的对象。(本文的例子)
  • 创建了新的线程。(非Cocoa程序创建线程时才需要)
  • 长时间在后台运行的任务。

自动释放池:
NSAutorelease类的一个实例,想一个对象发送autorelease消息时,该对象会自动加入到释放池中,待池销毁的时候,就会向池中的每一个对象发送一条release消息,释放对象。

实现原理:
以栈的形式实现,当创建一个新的自动释放池,它将被添加到栈顶,当一个对象收到autorelease消息时,它将被添加到当前线程的处于栈顶的自动释放池中,当自动释放池被回收的时候,它将从栈顶被删除,并且给池中所有的对象做一次release操作。

你可能感兴趣的:(iOS 内存管理初识)