高性能iOS应用开发-内存管理

本文探讨了iOS应用的内存管理,包括栈和堆的内存消耗、自动引用计数(ARC)的工作原理、自动释放对象和自动释放池的使用。强调了栈大小限制、对象生命周期管理和减少内存峰值的重要性,以实现高性能的应用开发。
摘要由CSDN通过智能技术生成

iOS设备中某个应用内存使用超过单个进程上的限制,会被系统终止使用。
内存问题常出现在重复的内存释放循环引用的情况。

内存消耗

内存消耗指的是应用消耗的RAM。iOS的虚拟内存模型并不包含交换内存,意味着不会被用来分页内存。
应用中内存消耗分为两部分:栈大小堆大小

栈大小

应用中新线程都有专用的栈空间,该空间由保留的内存和初始提交的内存组成。栈可以在线程存在期间自由使用。线程的最大空间很小,这就决定了以下限制:

  • 可被递归调用的最大方法数的限制,每个方法都有自己的栈帧或者可以看这个链接,消耗整体的栈空间。main中调用func1,func1中调用func2,这就存在三个栈帧,每个栈帧都会消耗一定字节的内存。
main() { //第一个栈帧
    func1(); //第二个栈帧
}

func1() {
    func2(); //在func1()上增加一个栈帧。
}
  • 一个方法中最多可以使用的变量个数的限制,所有的变量都会载入方法的栈帧中,并消耗一定栈空间。
  • 视图层级中可以嵌入的最大视图深度的限制,渲染符合视图,整个视图层级树种递归调用layoutSubviews和drawRect方法。若层级过深,会导致栈溢出。

堆大小

每个进程的所有线程共享同一个堆。应用并不能控制分配给它的堆。只有操作系统才能管理堆。
通过类创建的对象相关数据都存放在堆中。类可能包含属性或值类型的实例变量(iVars,基本数据类型),如int、char或struct。因为对象是在堆内创建的,所以他们只消耗内存。

使用NSString、载入图片、创建或使用JSON/XML数据、使用视图等都会消耗大量的堆内存。需要关注平均值和峰值内存使用的最小化
当对象被创建并赋值时,数据可能会从栈复制到堆。类似的,当值仅在内部使用时,也可能会被从堆复制到栈。
虽然没有强制规定,但内存最好不要超过80%~85%,要给系统内核留下足够内存。**不要忽视didReceiveMemoryWarning信号。

内存管理模型

管理模型基于持有关系(引用计数?retain or release?)的概念。如果一个对象正处于被持有状态,那它占用的内存就不能被回收。
当一个对象创建于某个方法内部十,那么方法就持有该对象。如果这个方法返回,则调用者声称建立了持有关系。这个值可以付给其他变量,对应的变量同样会声称建立了持有关系。
一旦与某个对象相关的任务全部完成,就是放弃了持有关系。这一过程中没有转移持有关系,而是分别增加或减少了持有者的数量。当持有者的数量降为零时,对象会被释放ÿ

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值