关于OC语言的内存管理
一、计数器的基本操作
1、retain
1>retain: +1
2>release: -1
3>retainCount: 获得计数器
2.僵尸对象、野指针、空指针
1>僵尸对象:所占用内存已经被回收的对象,僵尸对象不能再使用
2>野指针:指向僵尸对象(不可用内存)的指针
3>空指针:没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错
4>在最后最好让指针nil一次,确保无错误
3、方法
1>你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作)
2>你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次release操作)
3>谁retain ,谁release
4>谁alloc , 谁release
二、set方法的内存管理
/*
_speed:直接访问成员变量
self—>_speed:直接访问成员变量
self.speed :set方法
[self speed] :get方法
*/
内存管理代码规范:
1.只要调用了alloc,必须有release (autorelease)
如果对象不是通过alloc产生的,就不需要release
2.set方法的代码规范
1>基本数据类型:直接复制
- (void)setAge:(int)age
{
_age = age;
}
2>OC对象类型
- (void)setCar:(Car *)car
{
//1.先判断是不是新传进来的对象
if (car != _car)
{
//2.对旧对象做一次release
_car = [car release];
//3.对新对象做一次retain
_car = [car retain];
}
}
3.dealloc方法的代码规范
1>一定要 [super dealloc],而且放到最后面
2>对self(当前)所拥有的其他对象做一次release
- (void)dealloc
{
[_car release];
[super dealloc];
}
三、@property参数
/*
@property的四种参数
1.set方法内存管理相关的参数
*retain:release旧值,retain新值(适用于OC对象类型)
*assign:直接赋值(默认,适用于非OC对象类型)
*copy:release旧值,copy新值
2.是否要生成set方法
*readwrite:同时生成setter和getter的声明、实现(默认)
*readonly:只会生成getter的声明、实现
@property (nonatomic,assign,readwrite)int weight;
3.多线程管理
*nonatomic:性能高(一般就用这个)
*atomic:性能低(默认)
4.setter和getter方法的名称
*setter:决定了set方法的名称,一定要有个冒号:
*getter:决定了get方法的名称(一般用在BOOL类型)
//返回BOOL类型的方法名一般以is开头
@property (getter = isRich) BOOL rich;
*/
1>OC对象类型
@property (nonatomic,retain) 类名 *属性名;
@property (nonatomic,retain) Car *car;
@property (nonatomic,retain) id car;
2>非OC对象类型 (int\float\enum\struct)
@property (nonatomic,assign) 类型名称 属性名;
@property (nonatomic,assign) int age;
四、autorelease
1.系统紫塞的方法中,如果不包含alloc、new、copy,那么这些方法返回的对象都是已经autorelease过的
[NSString stringWithFormat:.....];
[NSDate date];
2.开发中经常写一些类方法快速创建一个autorelease的对象
*创建对象的时候不要直接使用类名,用self
//NSString NSNumber ...... 前面NS代表作者名,NS代表Next Step这家公司
{// { 开始代表创建了释放池
//autorelease方法会返回对象本身
//调用完autorelease方法后,对象的计数器不变
//autorelease会将对象放到一个自动释放池中
//当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
} // }结束代表销毁释放池
/*
1.@class的作用:仅仅告诉编译器,某个名称是一个类
@class Person; //仅仅告诉编译器,Person是一个类
2.开发中引用一个类的规范
1>在.h文件中用@class来声明类
2>在.m文件中用#import来包含类的所有东西
3.两端循环引用解决方案
1>一端用retain
2>一端用assign
*/