iOS中内存管理

来源:互联网 发布:什么手机支持4g十网络 编辑:程序博客网 时间:2024/06/05 05:02

内存管理的基本原则:

1、谁创建谁释放,

2、如果需要持有一个对象,那么对其发送retain 如果之后不再使用该对象,那么需要对其发送release(或者autorealse) 每一次对retain,alloc或者new的调用,需要对应一次releaseautorealse调用


为什么要进行内存管理:

1、程序运行时的内存资源是有限的,Objective-C语言所编写的程序中需要实例化对象
2、对象是要占用内存的,如果创建了对象(分配了内存),而不去释放这些对象所占用的内存,将会发生内存泄露
3、程序所使用的内存会随着程序的中对象的增加而不断增加
4、最终内存被耗尽之时就是程序崩溃之时
5、iOS系统为每一个程序分配了30M内存,程序使用内存超过20M会收到警告,超过30Mcrash程序(主要看配置)
生命周期:
程序中的对象具有生命周期,包括以下三个时期
1、对象的初始化(allocnew
2、对象接收消息和执行操作
3、对象被释放
如果对象不存在了,其所占用的内存应该交还系统以被其他新的对象来使用
如何得知一个对象是否寿命结束?Cocoa采用引用计数的技术
引用计数:
1、每个对象有一个整数值,这个整数值与对象本身关联,称为引用计数器
2、当某些地方需要使用这个对象时,可以将引用计数器加1,表示需要使用这个对象
3、使用完毕之后,将该对象的引用计数器值减1,表示该对象已经使用完毕
4、如果引用计数器值为0时,表明没有地方再使用该对象,这时系统将销毁该对象,其所占用内存被收回,以便重用
引用计数器的操作:
1、当使用allocnew方法或者copy消息创建一个对象时,对象的引用计数器值被设置为1
2、如果要增加某个对象的引用计数器,可以向对象发送retain消息
3、如果要减少对象引用计数器的值,可以向对象发送release消息
4、如果想要获取某个对象当前的引用计数器的值,可以向对象发送retainCount消息

- (id)retain;计数+1

- (void)release;释放

- (unsigned long)retainCount;计数


- (void)dealloc {对象被销毁会执行该语句

  NSLog(@”dealloc方法被调用!);

  [super dealloc]; //注意这句话一定要位于dealloc方法最后需要调用到他的父类方法

}

RetainTester * tester = [RetainTester new]; //计数器为1

[tester retain]; //计数器为2

NSLog(@“%ld”,[tester retainCount]);

[tester retain]; //计数器为3

[tester release]; //计数器减1,变为2

[tester release]; //计数器减1,变为1

NSLog(@“%ld”,[tester retainCount]);

[tester retain]; //计数器加1,变为2

[tester release]; //计数器减1,变为1

[tester release]; 

NSLog(@“%ld”,[tester retainCount]);

//计数器减1,变为0

//然后系统调用dealloc方法将tester的内存销毁

对象所有权:

1、也称为“拥有一个对象”

2、某个对象一旦拥有另外一个对象,那么这个对象要确保对其拥有的另外一个对象进行清理

3、一个对象有其他对象类型的实例变量称为拥有这些对象

4、一个函数中创建了一个对象的局部变量,则称这个函数拥有这个对象

5、有可能多个对象同时都拥有一个特定的对象,这种所有权更加复杂



最后解决方法:(若是copy则把release写成copy)

- (void) setEngine : (Engine *) newEngine {

  if (engine != newEngine) {
  [engine release];

  engine = [newEngine retain];

  }

}

- (void) setEngine : (Engine *) newEngine {

  [newEngine retain];

  [engine release];

  engine = newEngine;

}

自动释放池:

自动释放池是一个存放对象的池,这些对象将来能够被自动释放掉
NSObject提供了一个autorelease方法
此方法用于预先设定一下,将来会在某个时刻将其释放,所以使用之后引用计数不变
这个对象就被标注为自动释放对象

将这个对象放入自动释放池,池销毁时,会给所有自动释放对象发送release消息
内存管理规则
当使用new,alloccopy方法创建一个对象时,该对象引用计数器为1。如果不需要使用该对象,可以向其发送releaseautorelease消息,在其使用完毕时被销毁
如果通过其他方法获取一个对象,则可以假设这个对象引用计数为1,并且被设置为autorelease,不需要对该对象进行清理,如果确实需要retain这个对象,则需要使用完毕后release
如果retain了某个对象,需要releaseautorelease该对象,保持retain方法和release方法使用次数相等

如果使用newalloccopy方法获得一个对象,则必须释放或自动释放该对象

0 0