学习过java的人都知道,java中用一个变量引用对象,如果引用不存在,就回收这个对象。
现在大家都用Xcode6来开发程序,都不怎么注意内存回收机制的问题,感觉就跟java的垃圾回收机制一样,但是我们要注意的是ios并不支持垃圾回收机制,只不过他们都不需要我们显式的管理内存;
oc中只有继承了NSObject对象才需要管理内存,每个对象内部都有一个整数引用计数器,当对象的引用计数器等于0时,就销毁对象。它占用的内存也好被系统回收,oc也会自动向对象发送一条dealloc消息,我们一般会重写dealloc方法(相当于一个对象的遗言我们可以在里面做内存管理的一些操作),retainCount可以获得当前的计数器值。
IOS内存管理机制有三种:
1、ARC(automatic reference counting 自动引用计数,注意跟垃圾回收机制完全不同)
ARC是IOS5以后的编译器新特性,而不是iOS运行时特性(除了weak指针系统)arc就是相当于在适当的地方帮我们插入retain,release,autorelease等方法;
ARC的规则非常简单:只要还有一个变量指向对象,对象就会保持在内存中。当指针指向新值,或者指针不再存在时,相关联的对象就会自动释放。这条规则对于实例变量、synthesize属性、本地变量都是适用的。
注意:
不要把大量循环操作放到同一个自动释放池里面,会造成内存峰值上升;
对于大内存占用的尽量少使用arc,因为是延迟释放机制,所以会导致用完一直放在那边等到最后回收;
5.0版本之后:
Student *stu = [[Student alloc]init];
@autoreleasepool {
[stu autorelease];
@autoreleasepool {
}
}
5.0之前版本:
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];
//5.0之前版本
[pool release];
系统会生成很多自动释放池,调用autorelease会把stu对象扔进池子里面,自动释放池销毁,池子里面所有对象都会调用release方法,计数器-1(但是不代表对象一定会被销毁);
当我们pool 调用release消息时,他会向池中所有对象发送一条release消息,并且销毁自身;当pool调用drain时,并不会销毁自身。
如下对象在第一个池子被销毁,并不会把stu销毁:
Student *stu = [[Student alloc]init];
@autoreleasepool {
[stu autorelease];
@autoreleasepool {
[stu retain];
NSLog(@"pool2 is exit");
NSLog(@student :%i",[stu retainCount]);
}
NSLog(@"student :%i",[stu retainCount]);
}
[stu release];
3、手动释放内存
理念:谁创建谁释放,谁污染谁治理
就是自己调用alloc,new,retain,copy 自己就要调用release,当计数器为0时系统自动施放对象
NSLog(@"%zi",[student retainCount])
{
[name release];
name = [str retain];
}