23 内存管理

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操作

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 6,067评论 1 16
  • 为什么进行内存管理? 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时...
    天天想念阅读 4,398评论 1 6
  • 11.看下面的程序,第一个NSLog会输出什么?这时str的retainCount是多少?第二个和第三个呢? 为什...
    AlanGe阅读 4,119评论 1 4
  • iOS内存管理 概述 什么是内存管理 应用程序内存管理是在程序运行时分配内存(比如创建一个对象,会增加内存占用)与...
    蚊香酱阅读 11,010评论 8 119
  • 大女儿9月1号开始上幼儿园,一个月请了两次假。一次是发烧,一次是30号感冒咳嗽。上幼儿园的前两个星期特别抗拒,早上...
    一叶知秋V阅读 1,436评论 1 0

友情链接更多精彩内容