乐趣区

关于iOS开发:iOS内存管理浅析

Objective- C 内存治理的对象

iOS 开发中,内存中的对象次要有两类,一类是值类型,比方 int、float、struct 等根本数据类型,另一类是援用类型,也就是继承自 NSObject 类的所有的 OC 对象。前一种值类型不须要咱们治理,后一种援用类型是须要咱们治理内存的,一旦治理不好,就会产生十分蹩脚的结果。

为什么值类型不须要治理,而援用类型须要治理呢?那是因为他们分配内存形式不一样。

值类型会被放入栈中,他们顺次严密排列,在内存中占有一块间断的内存空间,遵循先进后出的准则。援用类型会被放到堆中,当给对象分配内存空间时,会随机的从内存当中开拓空间,对象与对象之间可能会留有不确定大小的空白空间,因而会产生很多内存碎片,须要咱们治理。

栈内存与堆内存从性能上比拟,栈内存要优于堆内存,这是因为栈遵循先进后出的准则,因而当数据量过大时,存入栈会显著的升高性能。因而,咱们会把大量的数据存入堆中,而后栈中寄存堆的地址,当须要调用数据时,就能够疾速的通过栈内的地址找到堆中的数据。

值类型和援用类型之间是能够互相转化的,把值类型转化为援用类型的过程叫做装箱,比方把 int 包装为 NSNumber,这个过程会减少程序的运行时 间,升高性能。而把援用类型转为值类型的过程叫做拆箱,比方把 NSNumer 转为 float,在拆箱的过程中,咱们肯定要留神数据原有的类型,如果类型错 误,可能导致拆箱失败,因而会存在安全性的问题。手动的拆箱和装箱,都会减少程序的运行工夫,升高代码可读性,影响性能。

在 IOS 开发过程中,栈内存中的值类型零碎会主动治理,堆内存中的援用类型是须要咱们治理的。每个 OC 对象外部都专门有四个字节来存储援用计数器,它是一个整数,示意对象被援用的次数,通过它能够判断对象是否被回收,如果援用计数为 0,对象回收,不为 0 不回收。当对象执行 alloc、new 或者 retain 时,援用计数加 1,release 时,援用计数减 1。

退出移动版