首页 > 代码库 > OC加强 内存管理
OC加强 内存管理
1 . 基本方法使用
1> retain : 计数器 + 1 , 会返回对象本身
2> release : 计数器 - 1 , 没有返回值
3> retainCount : 获取当前的计数器
4> dealloc
* 当一个对象要背回收的时候, 就会调用
* 一定要调用[super dealloc] , 这句调用要放在最后面
2.概念
1>僵尸对象 : 所占用内存已经被回收的对象, 僵尸对象不能再使用
2>野指针 : 指向僵尸对象 (不可用内存) 的指针
3>空指针 : 没有指向任何东西的指针(存储的东西是nil, NULL , 0 ) , 给空指针发送消息不会报错
注意:
1 . 想使用(占用) 某个对象 , 就应该让对象的计数器+1 (retain操作)
2 . 不想使用(占用) 某个对象 , 就让对象的计数器 -1 (release操作)
3 . 谁 retain , 谁 release
4 . 谁 release , 谁 release
内存管理代理规范
1.只要调用alloc , 必须有 release (autorelease)
2.set方法的代码规范
1>基本数据类型 :直接复制
-(void)setAge:(int)age
{
_age = age;
}
2> OC对象类型
- (void)setCar:(Car*)car
{
// 1. 先判断是不是新传进来的对象
if( car != _car)
{
// 2. 对旧对象做一次release
[ _carrelease ]; // 第一次调用为 nil
// 3. 对新对象做一次retain
_car = [carretain];
}
}
3 . dealloc 方法的代码规范
1> 一定要调用[super dealloc] , 而且要放到最后面
2> 对self(当前对象) 所拥有的其他对象做一次release
- (void)dealloc
{
[ _carrelease];
[ superdealloc];
}
ARC automaticReference Counting 自动引用计数
ARC 编译器特性
编译器会在适当时候,加入内存管理的代码
强指针:默认所有的指针都是强指针
只要是有强指针指向一个对象,那么这个对象就不会被释放
只要是没有强指针指向一个对象,那么这个对象就被立即回收
__strong 强指针标示,但是默认所有指针都是强指针,所以他没有用
弱指针:弱指针指向的对象不影响对象回收
注意:不要用弱指针指向一个刚刚创建出来的对象
当出现循环引用的时候,必须要由一端是弱指针
----------------------------------------------------------------------------
案例 :
#import <Foundation/Foundation.h>
#import "CZPerson.h"
/*
如果内存管理不当
1、不再使用对象没有被回收,内存泄露,最终导致程序闪退
2、正在被使用对象被释放了,野指针,访问野指针就会导致程序崩溃
ARC Automatic Reference Counting 自动引用计数
MRC Manual Reference Counting 手动引用计数
1、当一个对象刚刚出生时候,它的引用计数 1
2、当对象上引用计数是0的时候,系统立即把它回收
3、release 引用计数-1
4、retain 引用计数+1
int main(int argc, const char * argv[]) {
CZPerson *person =[[CZPerson alloc] init];//1
long count = [person retainCount];
NSLog(@"%zd",count);
[person retain];//2
NSLog(@"%zd",[personretainCount]);
[person release];//0
NSLog(@"%zd",[personretainCount]);
[person release];
// person = nil;
// 当一个指针指向 nil,这个指针我称为空指针
// 给空指针发送消息系统不会报错,它什么都不做
[person test];
[person dealloc];
NSLog(@"%zd",[personretainCount]);//
return 0;
}
#import <Foundation/Foundation.h>
@interface CZPerson : NSObject
- (void) test;
@end
@implementation CZPerson
- (void) test
{
NSLog(@"CZPerson");
}
//永远不要试图自己调用这个方法
-(void) dealloc
{
// 这里可以验证对象是否被回收了
NSLog(@"CZPerson回收");
// 这个方法中必须调用父类该方法,并且必须放在最后
[super dealloc];
}
@end
OC加强 内存管理