iOS的内存分区

iOS中内存分区

iOS内存模块

应用在内存中运行,不同的类型在内存处于不同分区。
按照内存地址由低到高分为:代码区、常量区、全局/静态区、栈、 堆、栈、全局区/静态区、常量区、代码区

如下图:

iOS内存分配

代码区

在内存的最低地址区间,用于存储编译完成后代码部分。

常量区

用于常量内存分配,由系统维护

全局区/静态区(static)

主要为全局变量和静态变量分配内存,分为、初始值和未初始过的两个部分。

堆(heap)

由开发者分配释放(或者编译器自动添加释放命令),不释放可能引起内存泄露。分配时,堆内采用链表形式管理内存段,需要分配时对链表进行遍历,找到空间大于申请的节点分配给开发者,然后在链表中删除节点。

特点:

  • 堆区分配使用alloc, Swift的引用类型内存在堆区
  • 开发者自行管理,ARC由编译器自动添加管理命令
  • 地址由低到高,内存分配靠遍历链表查找

优点

  • 可以使用引用计数让多个ower拥有(只有heap内对象才可以用"引用计数")

栈(stack)

由编译器管理自动释放,如方法内变量,局部变量等。分配时只要栈的空间大于对象申请的空间,就会提供该段内存,否则报栈溢出。

对于一个方法,在方法作用域内形成一个栈帧(stack frame)(包含参数,局部变量,返回值等),执行完方法后,栈帧弹出,里面所有内存销毁。

特点:

  • 存放局部变量,函数跳转地址,指针地址,值类型对象等,先进先出,出了作用域就销毁。
  • 开发者不需要管理栈区内存,分配由高到低。
  • 内存分配是连续的。

优点

  • 速度快,管理简单,有严格生命周期
  • 一般不会出现内存泄露问题(还是有小机率造成循环引用的内存泄露)

缺点

  • 不灵活,创建时候是多大以后就多大,且owner只有一个。

相关问题

block使用copy属性关键字的原因

block定义后存在栈区,如果作用域改变,就会导致block可能被回收,所以当赋值操作时,进行copy操作,将block拷贝到堆区,保证使用过程不会被回收。

weak对象释放时自动置为nil实现

系统有一个weakhash表,将weak标记的对象地址注册到表中,如果对象被destory销毁,则在weak表中将改对象地址置为nil。

苹果内存引用实现

通过引用计数hash表来实现,对hash表进行操作来实现。引用计数表记录内存地址,以便找到对象。

Swift值类型与引用类型内存分配区别

值类型直接在栈区分配对象的内存,引用类型(class)先在堆分配对象内存,然后再在栈区分配对象的指针。

stack
struct Point {
 var x, y:Double
 func draw() {}
}
let point1 = Point(x:0, y:0) //进行point1初始化,开辟栈内存
var point2 = point1 //初始化point2,拷贝point1内容,开辟新内存
point2.x = 5 //对point2的操作不会影响point1
// use `point1`
// use `point2`

point1和point2为两片不同内存对象。

结构体(值类型)内存分配

heap
// Class
class Point {
 var x, y:Double
 func draw() {}
}
let point1 = Point(x:0, y:0) //在堆区分配内存,栈区只是存储地址指针
let point2 = point1 //不产生新的实例,而是对point2增加对堆区内存引用的指针
point2.x = 5 //因为point1和point2是一个实例,所以point1的值也会被修改
// use `point1`
// use `point2`

point1与point2指向同一个堆对象。

类内存分配

参考

iOS开发堆栈你理解多少

深入剖析Swift性能优化

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: iOS内存管理版本记录如下: 1. iOS 2.0及更早版本:使用手动管理内存的方式。 2. iOS 3.0:引入了基于引用计数的自动内存管理,使用retain和release函数来增加或减少对象的引用计数。 3. iOS 5.0:引入了ARC(自动引用计数)机制,ARC会在编译时自动插入retain和release代码,减少手动管理内存的工作。 4. iOS 7.0:引入了内存诊断工具Memory Usage Report,可以监测App内存使用情况,帮助开发者优化内存管理。 5. iOS 8.0:引入了一些新的API,如NSCache和NSURLSession,使得内存管理更加方便和灵活。 6. iOS 11.0:引入了基于图片大小的UIImage渲染机制,减少了内存占用。 7. iOS 13.0:引入了叫做“Scene”的多任务环境,使得内存管理更加复杂,需要更加小心谨慎地处理内存问题。 总的来说,随着iOS版本的不断更新,内存管理的机制也在不断地完善和优化,使得iOS应用能够更加高效地使用内存,提高用户体验。 ### 回答2: iOS内存管理是由操作系统自动管理的,在不同的版本中有所不同。 在iOS 5之前的版本中,内存管理主要依赖于手动管理引用计数(reference counting)来管理对象的生命周期。开发者需要手动调用retain和release方法来增加或减少对象的引用计数,以确保对象在不再需要时能够被正确释放。这种方式需要开发者非常谨慎地管理对象的引用,以避免内存泄漏或野指针等问题。 从iOS 5开始,iOS引入了自动引用计数(Automatic Reference Counting,ARC)的内存管理机制。ARC可以自动地插入retain、release和autorelease等方法的调用,使得开发者不再需要手动进行内存管理。开发者只需要关注对象的创建和使用,而不需要关心具体的内存管理细节。ARC减少了内存管理的工作量,提高了开发效率,并且减少了内存泄漏和野指针等问题的发生。不过,ARC并不是完全的自动化内存管理,开发者仍然需要遵循一些规则,比如避免循环引用等,以保证内存的正确释放。 随着iOS版本的不断更新,苹果不断改进和优化内存管理机制。每个新版本都带来了更好的性能和更高效的内存管理。开发者可以通过关注苹果的官方文档和开发者社区中的更新内容来了解每个版本中的具体变化和改进。 总结来说,iOS内存管理从手动的引用计数到自动引用计数的演变,极大地简化了开发者的工作,并提高了应用的性能和稳定性。随着不断的改进和优化,iOS内存管理会越来越高效和可靠。 ### 回答3: iOS内存管理版本记录是指苹果公司在不同版本的iOS操作系统中对于内存管理方面的改进和更新记录。随着iOS版本的不断迭代,苹果在内存管理方面进行了一系列的优化和改进,以提高系统的稳定性和性能。 首先,在早期的iOS版本中,苹果采用了手动内存管理的方式,即开发人员需要手动创建和释放内存,容易出现内存泄漏和内存溢出等问题。为了解决这些问题,苹果在iOS5版本中引入了自动引用计数(ARC)机制。ARC机制能够通过编译器自动生成内存管理代码,避免了手动管理内存带来的问题。 其次,iOS6版本引入了内存分页机制。这个机制能够将应用程序内存分成不同的页,将不常用的页置于闲置列表中,从而释放出更多的内存空间。这些闲置列表中的页能够在需要时快速恢复到内存中,减少了内存压力。 此外,iOS7版本中进一步提升了内存管理的能力。苹果在这个版本中引入了内存压缩技术,将内存中的数据进行压缩,从而提高了内存利用率。此外,iOS7还引入了资源清理功能,可以自动清理不再使用的资源,释放内存空间。 最后,在iOS13版本中,苹果进一步改进了内存管理策略。该版本中引入了后台内存优化功能,能够自动优化应用在后台运行时的内存占用,减少了后台应用对于系统内存的占用和影响。 综上所述,iOS内存管理版本记录反映了苹果在不同版本的iOS操作系统中对于内存管理方面的改进和优化。这些改进和优化使得iOS系统更加稳定和高效,并且提升了应用程序的性能和用户体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值