OC中的内存管理02

四、自动释放池 (autorelease)

1)基本原理:

1> 自动释放池是OC里面一种内存管理的自动回收机制,一般可以将临时变量添加到自动释放池中,统一回收释放。

2> 当自动释放池销毁的时候,在自动释放池中所有的对象都会调用一次release方法。

3> OC对象只要发送一条autorelease消息,会把对象方法放在最近的释放池中(栈顶的释放池)。

4> autorelease实际上是延迟了release方法的调用,每一次autorelease就会把对象放在当前的autorelease pool中,当pool被释放时,在pool中所有的对象调用该一次release。

2)自动释放池的创建:

1> ios 5.0后:

@autoreleasepool{

//..........

}

2> ios 5.0之前:

NSAutoreleasePool *pool=

[[NSAutoreleasePool alloc]init];

//...............

[pool release] ;或者 [pool drain];

3)autorelease的使用:

1> 以前:

Book *book = [[BooK alloc] init];

[Student setBooK:book];

[book release];

2> 现在:

Book *book =[[[Book alloc] init] autorelease];

[Student setBook:book];

//不在调用[book release];

3> 快速创建对象的静态方法:

+ (id) person{

  return [[[Person alloc] init]autorelease];

}

外部调用[Person person]时,根本不用考虑什么时候释放返回Person对象。

4)autoreleasepool的相关疑问:

疑问:

  在iPhone项目中,main()中有一个默认的Autorelease Pool,程序开始时创建,程序退出时销毁,按照对Autorelease的理解,岂不是Autorelease Pool里的所有对象在程序退出时才release,这样跟内存泄露有什么区别?

解答:

  对于每一个Runloop, 系统会隐式创建一个Autorelease pool,并且把创建好的pool放在栈顶,所有的pool会构成一个栈式结构。在每一个Runloop结束时,当前栈顶的pool会被销毁,这样这个pool里的每个对象会执行release操作。

5)autoreleasepool的使用注意:

1> 在ARC模式下不能使用[[AutoreleasePool alloc] init] ,而应当使用@autoreleasepool。

2> 不要把大量的循环操作放在NSAutoreleasePool之间,这样会造成内存的峰值上升。

3> 对于大内存尽量避免使用这种方法,对于这种延迟释放机制还是少用。

4> sdk中一般利用静态方法创建并返回的对象一本都已经autorelease的,不在需要release了。

6)@property的参数

1> 参数可有可无:

@property int age;

@property(nonatomic,retain) NSString * name;

2> 参数的分类:

读写属性:readwrite/readonly;

setter处理:assign/retain/copy;

原子性:atomic/nonatomic;

3> 默认参数是atomic

提供多线程保护,在多线程保护下,原子操作是有必要的,否则可能引起错误的结果。

加了atomic,setter/getter是一个原子操作,如果有多个线程同时调用setter的话,不会出现某个线程在执行setter的全部语句之前,另一个线程开始执行setter的情况,相当于函数头尾加了锁一样的。

4> 常用的参数noatomic

写上之后是说明禁止多线程,保护变量,提高性能。

atomic是OC使用的一种多线程保护机制,防止写入没有完成的时候被另外一个线程读取,造成数据错误。而这种机制是耗费系统资源的,所以在iphone这种小型设备上,如果没有使用多线程的通讯编程,那nonatomic是一个非常好的选择。另外不涉及锁操作,所以它执行相对快点。

5> @property其他参数

readwrite: 产生setter\getter readonly: 只产生简单的getter,没有setter。

assign: 默认类型,setter方法直接赋值,而不进行retain操作

retain: setter方法release旧值,再retain新值

copy: setter方法release旧值,再copy新值

时间: 2024-10-20 04:47:08

OC中的内存管理02的相关文章

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

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

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

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

oc中的内存管理

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

黑马程序员--Objective-C之--OC中的内存管理

对于面向对象的变成语言,程序需要不断地创建对象. 初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象, 而那些老的对象已经不会再被调用,也不再有指针指向他们,如果程序没有回收他们占用的内存,就会出现内存泄露. 如果程序一直泄露内存,那么可用内存就会越来越少,直到没有足够的内存,程序將会崩溃.目前,主要有两种管理内存的技术,一是引用计数,二是垃圾回收. iOS平台目前只支持引用计数,Mac平台支持垃圾回收.

OC中的内存管理01

一.内存管理要遵循的原则 1> 谁创建,谁release (看到 alloc.copy.new就应该有写release的冲动). 2> 谁retain,谁release (简单的来说就是要负责嘛,不能retain后不管了). 3> 说明下苹果在这方面做的很严谨,后面的学习会接触到ARC,Xcode会帮我们自动管理相应的内存. 二.基本原理 1> 每个对象的内部都封装的一个与之相关的整数,称之为引用计数器. 2> 当使用alloc.new或者copy创建对象时,计数器被设置为1

iOS学习第四天杂记--Objective-C中的内存管理

先说明下,原文为青玉伏案写的.我这只是学习而已. OC中的内存管理. OC中使用引用计数和垃圾回收来管理内存,在OC中为每个对象分配一个引用计数器,当对象刚刚被创建时其初始值为1,当有某段代码需要访问一个对象时,会将该对象的引用计数器加1(通过retain来实现):当访问一个对象结束时,会将该对象的引用计数器减1(通过release来实现):当计数器为0时,该对象占用的内存空间会被收回.在NSObject类有一个retainCount方法,调用该方法可获取当前对象的引用计数值. Tips:测试时

Unity游戏开发中的内存管理_资料

内存是手游的硬伤——Unity游戏Mono内存管理及泄漏http://wetest.qq.com/lab/view/135.html 深入浅出再谈Unity内存泄漏http://wetest.qq.com/lab/view/150.html 这一次,我优化了37%的内存http://wetest.qq.com/lab/view/147.html Unity项目资源加载与管理http://wetest.qq.com/lab/view/124.html Android应用内存泄露分析.改善经验总结h

C++中的内存管理

在C++中也是少不了对内存的管理,在C++中只要有new的地方,在写代码的时候都要想着delete. new分配的时堆内存,在函数结束的时候不会自动释放,如果不delete我分配的堆内存,则会造成内存泄露.所以我们要学会内存管理,不要内存泄露.在C++中的内存管理机制和OC中的还不太一样,在OC中的ARC机制会给程序员的内存管理省不少事,但在C++中没有ARC所以我们要自己管理好自己开辟的内存.Java中也有自己相应的内存管理机制,比如JDBC里的获取的各种资源在finally里进行close等

OC - 浅谈内存管理

今天看到一篇不错的文章关于OC内存管理的,转载一下与你共享 概述我们知道在程序运行过程中要创建大量的对象,和其他高级语言类似,在ObjC中对象时存储在堆中的,系统并不会自动释放堆中的内存(注意基本类型是由系统自己管理的,放在栈上).如果一个对象创建并使用后没有得到及时释放那么就会占用大量内存.其他高级语言如C#.Java都是通过垃圾回收来(GC)解决这个问题的,但在OjbC中并没有类似的垃圾回收机制,因此它的内存管理就需要由开发人员手动维护.今天将着重介绍ObjC内存管理: 1 引用计数器 2