OC中如何对内存进行管理的

OC中的内存管理主要由三种方式ARC(自动内存计数),手动内存计数,内存池;

1)ARC:这种方式和java类似,在你的程序的执行中,始终有一个高人在你背后准确的帮你收拾垃圾,你不用考虑它什么时候开始工作,怎么样工作,你只需明白,我申请了一段内存空间,当我不再使用从而这段内存成为垃圾的时候,我就会彻底把它忘掉了,反正那个高人会帮我们收拾垃圾的,但遗憾的是,那个高人需要消耗一定的资源,在携带设备里面,资源是紧俏商品,所以iPhone不支持这个功能。

  解决:通过alloc-inital方式创建的,创建后引用计数器+1,此后每retain一次引用计数器+1,那么在程序中做相应的次数release就好了。

2)手动内存计数:就是说,从一段内存被申请之后,就存在一个变量用于保存被使用的次数,我们暂时把它称为计数器。当计数器变为0的时候,那么就是释放这段内存的时候,比如说,在程序A中一段内存被成功申请完成之后,那么这个计数器就从0变为1(我们称为这个过程为alloc),然后程序B也需要这个内存,那么计数器就从1变为2(我们把这个过程叫做retain)紧接着程序A不再需要这个内存了,那么这个计数器就会减1(我们叫这个过程为release),程序B也不需要这个内存的时候,那么也把计数器减去1(这个过程也叫release)当系统(也就是Foundation)发现这个计数器成员变为0,那么就会调用内存回收程序把这段内存回收(我们把这个过程叫做dealloc)顺便提一句,如果没有Foundation,那么维护计数器,释放内存等等工作需要你手动完成。

  解决:一般由类的静态方法创建的,函数名中不会出现alloc或init字样,如[NSString string]和[NSArray arrayWithObject:],创建后引用计数+0;在函数出栈后释放,即相当于一个栈上的局部变量,当然也可以通过retain延长对象的生存期。

3)内存池:可以通过创建和释放内存池控制内存申请和回收的时机。

  解决:是由autorelease计入系统内存池,内存池是可以嵌套的,每个内存池都需要有一个创建释放对象,就像main函数中写的一样,使用也很简单,如果[[[NSString alloc]initwithFormant:@"Hey you!"] autorelease],即将一个NSString对象加入到最内层的系统内存池,当我们释放这个内存池时,其中的对象都会被释放。

时间: 2024-08-21 12:57:12

OC中如何对内存进行管理的的相关文章

OC中属性的内存管理

在MRC模式下,我们建一个Person类的对象.h文件如下 1 #import <Foundation/Foundation.h> 2 3 @interface Person : NSObject 4 @property (nonatomic, retain)NSString *name; 5 @property (nonatomic, retain)NSString *sex; 6 @property (nonatomic, assign)NSInteger age; 7 //自定义初始化

iOS开发几年了,你清楚OC中的这些东西么1

前言 几年前笔者是使用Objective-C进行iOS开发, 不过在两年前Apple发布swift的时候,就开始了swift的学习, 在swift1.2发布后就正式并且一直都使用了swift进行iOS的开发了, 之后就是对swift持续不断的学习, 近来swift3.0的发布, 更多的人会选择swift来进行iOS的开发看上去更是成为了一种趋势, 不过一个合格的iOS开发者对oc以及c语言的掌握是必不可少的技能, 本篇中主要是写一些大家平时都可能用到但是不一定知道的oc的东西 1.oc中的对象的

oc中的内存管理

•所谓内存管理, 就是对内存进行管理, 涉及的操作有: 分配内存 : 比如创建一个对象, 会增加内存占用 清除内存 : 比如销毁一个对象, 能减小内存占用 •内存管理的管理范围 任何继承了NSObject的对象 对其他非对象类型无效(int.char.float.double.struct.enum等 ) •只有OC对象才需要进行内存管理的本质原因 OC对象存放于堆里面 非OC对象一般放在栈里面(栈内存会被系统自动回收) •系统是如何判断 什么时候需要回收一个对象所占用的内存? 根据对象的引用计

关于OC中得内存管理问题,alloc,retain,release,copy,dealloc

我们都知道,一个手机,它的内存是有限的,而每一个手机应用都是需要一定空间,当应用所占空间过大时,系统就会发出警告,怎样在有限的空间中,做到更高效实用美观的效果呢? 这时候就牵涉到OC中得内存管理了. 在OC这门语言中,是不存在垃圾回收机制的,但是它采用了另外一种形式或者说方法,实现这一个空间回收的效果,那就是引用计数器. 别看-引用计数器,这个名字很高大上,实际是它就是一个整数. 所以OC中分配4个字节才存储它. 引用计数的值只有两种:0和非0,我们知道,计算机其实是很笨的,结果只有这两种时,它

OC中内存管理(转)

OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也

OC中手动管理内存

//1.对象在完成创建的同时,内部会自动创建一个引用计数器,这个计数器,是系统用来判断是否回收对象的唯一依据,当我们的引用计数retainCount = 0的时候,系统会毫不犹豫回收当前对象 //2.[对象 release]  reatinCount - 1 //3.[对象 retain]   reatinCount + 1 ,返回self //4.我们的引用计数retainCount = 0的 对象就被销毁了 //5.dealloc函数,当一个对象要被销毁的时候,系统会自动调用dealloc函

OC中的内存管理02

四.自动释放池 (autorelease) 1)基本原理: 1> 自动释放池是OC里面一种内存管理的自动回收机制,一般可以将临时变量添加到自动释放池中,统一回收释放. 2> 当自动释放池销毁的时候,在自动释放池中所有的对象都会调用一次release方法. 3> OC对象只要发送一条autorelease消息,会把对象方法放在最近的释放池中(栈顶的释放池). 4> autorelease实际上是延迟了release方法的调用,每一次autorelease就会把对象放在当前的autor

简述OC中内存管理机制。

1        简述OC中内存管理机制.与retain配对使用的方法是dealloc还是release,为什么?需要与alloc配对使用的方法是dealloc还是release,为什么?readwrite,readonly,assign,retain,copy,nonatomic .atomic.strong.weak属性的作用? OC使用了一种叫做引用计数的机制来管理对象,如果对一个对象使用了alloc.[Mutable]copy,retain,那么你必须使用相应的realease或者aut

IOS阶段学习第20天笔记(OC中的内存管理)

IOS学习(OC语言)知识点整理 一.OC中的内存管理 1)概念:内存管理的对象为所有继承了NSObject的对象,对基本数据(如:int .float.double...)无效      OC中采用引用计数器对内存做管理,他是一个整数数据,表示对象引用的次数,每个对象分配4字节      的内存空间存放引用计数器.当一个对象的引用计数器为0时 它将被自动释放,反过来说 当使用alloc.      new .copy(mutableCopy)创建新对象时,引用计数器默认为1 2)黄金法则 当使