核心:
有alloc就有release
想用就retain
凡是使⽤了alloc、retain或者copy让内存的引用计数增加了,就需 要使⽤release或者autorelease让内存的引⽤计数减少。在一段代码
内,增加和减少的次数要相等。
内存管理代码规范:
1.只要调用了alloc必须有relea
2.set方法的代码规范
一.基本数据类型直接复制
_age = age;
二.OC对象类型
-(void)setName:(NSString *)name
{
//1.先判断是不是新对象
if (_name != name) {
[_name release];//2.对旧对象做一次release
_name = [name retain];//3.对新对象retain
}
}
3.dealloc方法的代码规范
一定要[super dealloc],而且放在最后;
对当前self所拥有的其他对象做一次release;
有交互就会产生自动释放池,使用便利构造器初始化会崩溃()
内存管理方式:
垃圾回收(gc)自动管理自动回收
MRC(manual reference count)人工引用计数:内存的开辟和释放都是有程序代码进行控制;
ARC(auto reference count )自动引用计数:iOS 5.0的编译器特性,它 允许⽤用户只开辟空间,不⽤用去释放空间。
引用计数
引用计数从1到0的时候,系统回收
copy方法的实现
跟retain不同,⼀个对象想要copy,⽣成自己的副本,需要实现 NSCopying协议,定义copy的细节(如何copy)。如果类没有接 受NSCopying协议⽽而给对象发送copy消息,会引起crash。
-(id)copyWithZone:(NSZone *)zone
{
//return [self retain];//指针拷贝 只是+1,没有拷贝(浅拷贝)
Student *stu5 = [[Student alloc] init];
// Student *stu4 = [Student allocWithZone:zone];//对象拷贝考的是内存(深拷贝)
// return stu4;
return stu5;
}
OC借助引⽤计数机制去管理内存,凡是使⽤了alloc、copy、retain等⽅方 法,增加了引用计数,就要使用release和autorelease减少引用计数,引⽤ 计数为0的时候,对象所占的内存,被系统回收。