iOS 内存管理

iOS 设备的内存是极其有限的,直接影响用户体验。
Session 242 iOS App Performance Memory

内存相关

  1. 堆栈:已知数据类型会被分配在栈上,栈上的内存不需要自己管理,栈是每个线程独享的一种数据结构,未知大小的类型需要向堆申请控件,堆的内存需要自己管理
  2. 比如:Person *p=[[Person alloc] init]; ,alloc是分配内存空间,init 是做初始化,*p存放堆空间返回的地址
  3. ARC实际上一个语法糖,编译器在合适的位置为你添加MRC的代码,只要出现了new,alloc,retain,就一定要出现一个release,autorelease
  4. 内存分类:Clean Memory,Dirty Memory
  5. 物理内存和虚拟内存
  6. 虚拟内存映射到物理内存会存在一个寻址的过程,界限寄存器判断物理内存地址是否越界,如果没有,就加上基址
  7. 桌面使用Swap机制,将不用的进程置换到磁盘
  8. iOS 使用优先级队列的机制,从闲置到后台再到前台,如果内存还是不足,就杀掉进程

属性

  1. atomic:线程安全
  2. nonatomic:非线程安全
  3. strong: 强引用对象
  4. weak: 弱引用对象
  5. assign: 基本数据类型,可以修饰非OC对象
  6. copy: NSString,NSArray,NSDictionary等

copy mutableCopy

  1. 集合对象的内容复制仅限于对象本身,对象元素仍然是指针复制 可变对象都是内容复制,不可变对象copy是指针,mutableCopy是内容复制

Retain Cycle

  1. strongweak dance
  2. __weak打破self环
  3. __strong确保对象不释放

NSAutoReleasePool

  1. 将线程中要执行的任务都放在自动释放池中,自动释放池会捕获所有任务中的对象,在任务结束或线程关闭之时自动释放这些对象
  2. 每个主Runloop结束时进行drain操作,自动释放池收到 drain消息时将这些对象的引用计数减一,然后将它们从池子中移除 。

AutoReleasePool

  1. 避免内存峰值,循环一次释放一次,一次性归还很多,每次归还一点点
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 貌似每个iOS开发者都有一篇属于自己的内存管理,记录了自己对内存管理理解的深度以及广度,所以我也来记录一下我的理解...
    Bugfix阅读 6,707评论 0 3
  • Copyright © 2017年ZaneWangWang. All rights reserved. 如果你看到...
    2897275c8a00阅读 4,411评论 0 1
  • iOS内存分区 栈区,内存管理由系统负责,一个线程对应一个栈区,服从先进后出原则 堆区,内存管理由程序员负责...
    豆大大阅读 2,635评论 0 3
  • 1. 内总管理原则(引用计数) IOS的对象都继承于NSObject, 该对象有一个方法:retainCount...
    lilinjianshu阅读 6,478评论 0 2
  • 冯·诺依曼体系:运算器 控制器 存储器 输入与输出 内存即存储器,用来存储指令与数据 注:哈佛体系与普林斯顿体系的...
    小李龍彪阅读 3,838评论 0 8