-----------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -----------
一、 内存管理
OC中内存有五种
局部变量是存储在,栈内存中
动态变量存储在,堆内存中,对象就是存储在堆内存中
局部变量在运行完后,系统会自动释放,而对象不会自动释放,
设想一下,植物大战僵尸中的子弹对象,如果不及时回收,释放内存,子弹会占用非常多的内存空间
所以对象需要我们,释放其所占空间,以保障软件流畅运行。
二、 对象的释放机制
OC中我们通过引用计数器来控制对象什么时候被销毁,我们规定:当对象引用计数器值为0时,对象被回收。
当我们在创建一个对象时,他的引用计数器被赋值为1,每被赋值一次,计数器加1,当不在引用这个对象时,对象计数器减1,对象被销毁时,再减1。
我们通过retain 和 release 来实现计数器的加1,减1.
OC内存管理口诀:谁污染谁治理,alloc一下必须release一下。
Xcode6.2关闭内存管理方法:将YES改成NO,这样我们才能实现手动管理内存。ARC是OC中自动管理内存的机制,非常棒!省去我们很多时间写内存管理的重复代码。
下一章会讲到。
1、 引用计数器的基本使用
1.方法的基本使用
1> retain:计数器+1,会返回对象本身
2> release:计数器-1,没有返回值
3> retainCount:获取当前的计数器
4> dealloc
* 当一个对象要被回收的时候,就会调用
*一定要调用[super dealloc],这句调用要放在最后面
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property int age;
@end
@implementation Person
// 当一个Person对象被回收的时候,就会自动调用这个方法
- (void)dealloc
{
NSLog(@"Person对象被回收");
// super的dealloc一定要调用,而且放在最后面
[super dealloc];
}
@end
int main()
{
Person *p = [[Person alloc] init]; //对象被创建引用计数器加1
int a = [p retainCount]; //查看一下引用计数器的值
NSLog(@"%d", a);
//现在不用这个对象了将这个对象回收,掉用release。口诀,alloc一下,release一下。
[p release]; // 引用计数器为0,对象被回收,这时的指针就是野指针,它指向的对象就是僵尸对象
// 野指针继续调用对象方法,就会出现一些错误
[p retainCount];
// 空指针:指向没有任何对象的指针
p = nil;
return 0;
}