ios和其他操作系统的总体上来说大同小异,大的框架原理相同,小的细节和创新有所不同,IOSApp进程的地址空间分为代码区、数据区、栈区、堆区,进程开始时,会把mach-o文件的各部分,按需加载到内存中;对一般的iphone,实际物理内存都在1G左右,超大的内存需求,即当物理内存紧张情况时的处理:这是ios虚拟内存系统 和其他操作系统的区别:
当物理内存紧张时,ios会把可以通过重新映射来加载的内容直接清理出内存,杜宇不可再生的数据,ios需要App进程配合处理,向各进程发送内存警告要求配合释放内存,对于不能及时释放足够内存的,直接kill掉进程,必要时甚至是前台运行的。
OC内存管理原则:谁创建、谁释放,谁引用,谁管理。
内存管理主要要避免“过早释放”和“内存泄漏”,对于“过早释放”需要注意@property设置特性时,一定要用对特性关键字,对于“内存泄漏”,一定要申请了要负责释放,要细心。关键字alloc 或new 生成的对象需要手动释放;设置正确的property属性,对于retain需要在合适的地方释放,
oc是通过referringCount来决定是否回收内存,对象在开始alloc,引用计数器为1,每次出现retain,copy时,引用计数器都会加1,每当碰到release,autorelease时,引用计数器都会减1,如果rc为0,那么对象就会被销毁。
release和autorelease不同:引用计数器减1的时机不同而已,autorelease会在对象的使用真正结束的时候才能让引用计数减一。
a 在OC中,如果是ARC开发,编译器会在编译时,根据代码的结构,自动添加retain/release/autorelease
b ARC只负责管理OC部分的内存管理,而不负责C语言代码的内存管理,使用C语言框架出现retain/create/copy等字样的函数,大多数都需要进行release,否则会出现内存泄露
c 在混合开发时,如果在C和OC之间传递数据,需要使用__bridge进行桥接,桥接的目的是为了告诉编译器如何管理内存;MRC下,不需要 使用桥接
说到autorelease:
自动释放池以栈的形式实现:当你创建一个新的自动释放池的时候,它将被添加到栈顶,一个对象收到发送autorelease消息时,它将被添加到当前线程处于栈顶的自动释放池中,当自动释放池被回收的时候,他们从栈中被删除,并且会给池子里所有的对象都做一次release操作