内存管理的基本原则:
1、谁创建谁释放,
2、如果需要持有一个对象,那么对其发送retain 如果之后不再使用该对象,那么需要对其发送release(或者autorealse) 每一次对retain,alloc或者new的调用,需要对应一次release或autorealse调用
为什么要进行内存管理:
- (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;
}
自动释放池:
如果使用new、alloc或copy方法获得一个对象,则必须释放或自动释放该对象