内存管理
1、什么是内存管理
- 移动设备的内存极其有限,每个app所能占用的内存是有限制的
- 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要在使用的内存空间。比如回收一些不需要使用的对象、变量等
- 管理范围:任何继承了NSObject的对象,对基本数据类型不需要管理内存
2、对象的销毁
- 当一个对象的引用计数器为0时,它将会被销毁,其所占用的内存被释放
- 当一个对象被销毁时,系统会自动向对象发送一条dealloc消息
- 一般会重写dealloc方法,在这里释放相关资源,dealloc就像是对象的遗言
- 一旦重写了dealloc方法,就必须调用[super dealloc]方法,并且放在最后
- 不要直接调用dealloc方法
- 一旦对象被回收,它所占用的内存就不再使用,坚持使用会导致程序崩溃(野指针错误EXC_BAD_ACCESS)
3、计数器的基本操作
- retain:计数器+1
- release: 计数器-1
- retainCount:获取当前计数器个数
eg:
// ...... Person *p = [Person alloc] init] // 获取当前计数器个数 int count = [p retainCount]; // 计数器+1 [p retain]; // 计数器-1 [p release]; // .....
4、set方法的内存管理
核心思想:release旧值,retain新值eg:// 假设人拥有Car对象,set方法 - (void)setCar:(Car *)car { // 判断是否是新车 if ( _car != car ) { // release 旧值 [_car release]; // retain 新值,retain方法是有返回值的,返回值是它本身 _car = [car retain]; } }
5、@property参数
- set方法内存管理相关参数
- 是否生成set方法
- 多线程管理
- setter和getter方法的名称
eg:/* 1.set方法内存管理相关的参数 * retain : release旧值,retain新值(适用于OC对象类型) * assign : 直接赋值(默认,适用于非OC对象类型) * copy : release旧值,copy新值 2.是否要生成set方法 * readwrite : 同时生成setter和getter的声明、实现(默认) * readonly : 只会生成getter的声明、实现 3.多线程管理 * nonatomic : 性能高 (一般就用这个) * atomic : 性能低(默认) 4.setter和getter方法的名称 * setter : 决定了set方法的名称,一定要有个冒号 : * getter : 决定了get方法的名称(一般用在BOOL类型) */
6、atuorelease
- atuorelease本身不加减对象引用计数器,只是将对象放到自动释放池中,当池子销毁的时候自动调用对象的release方法
- 系统自带创建对象的方法中,如果不包含alloc、new、copy,那么这些方法返回的对象都是已经atuorelease过的([NSString stringWithFormat:@"%d",100])
- 开发中经常写一些类方法快速创建一个atuorelease的对象(创建对象的时候不要直接使用类名,用self)
eg@autoreleasepool{ // 创建一个atuorelease的对象 Person *p = [[[Person alloc] init] autorelease]; } // 池子销毁时自动调用[p release]