1.内存管理:程序在运行中管理内存分配的过程,当需要就申请一片内存,不用就释放掉,站在对象分配所有权的角度来分配内存。
2.内存管理的两种方法:
MRR(Manual Retain Release)手动-------reference counting 引用计数机制
ARC (Automatic Reference counting)自动-------系统在程序编译阶段自动添加了释放对象的方法。
3.引用计数器:(我们无法查看结果,但是如果我们按照规范来书写,那么是没有问题的)
When you create an object, it has a retain count of 1.
When you send an object a retain
message, its retain count is incremented by 1.
When you send an object a release
message, its retain count is decremented by 1.
When you send an object a autorelease
message, its retain count is decremented by 1 at the end of the current autorelease pool block.
If an object’s retain count is reduced to zero, it is deallocated.
4.引起内存错误的两种情况:
释放掉一个正在使用的对象
不用的对象没有释放掉导致内存错误
5.RULES
-
You own any object you create
享有自己创建的对象的拥有权--new,alloc,copy 应该负责释放
-
You can take ownership of an object using retain
对已经有的对象声明拥有权--strong,retain(通过setter方法和init方法)
-
When you no longer need it, you must relinquish ownership of an object you own
当长时间没有使用必须释放掉拥有权--release,autorelease
-
You must not relinquish ownership of an object you do not own
不能去释放一个没有拥有权的对象
6.autorelease与release的区别
release是立刻释放
autorelease是延迟释放(系统)
NSString *string = [[[NSString alloc] initWithFormat:@"%@:%@",self.name, self.address] autorelease];
企业习惯用 autorelease 因为操作方便出错概率小,一段时间内内存是增加的,牺牲了内存维护了代码的健壮性。
7.释放掉对象本身拥有的资源
通过在类的实现文件里面重写父类的dealloc方法来实现释放一个对象本身拥有的资源
-(void)dealloc
{
[_car release]; //先释放掉自己对象的拥有权
[super dealloc]; //然后再调用[super dealloc]释放自己
}
dealloc方法是当这个对象的拥有者为0,那么系统会自动调用对象的dealloc方法,不能主动去调用
8.retain cycle
A对象拥有B对象,B对象拥有A对象
当A要释放自己的时候,必须等B对象释放对自己的所有权
当B要释放自己的时候,必须等A对象释放对自己的所有权
解决方法:大强引用小的,小弱引用大的
9.重写setter方法
-(void)setName:(NSString *)name{
if (_name != name) {
[_name release];
_name =[name retain]; //property( ,strong)重写的时候必须加
}
}
10.autorelease pool三种情况要写
a.当创建一个非UI的工程,需要自己写
b.在一个循环里面会产生大量的临时对象
c.开辟一个新的线程