内存管理
2015-08-25 10:38 TemptationM 阅读(79) 评论(0) 收藏 举报一:
1. retain release方法的基本使用
2.retain计数器加1 会返回对象本身
3. release计数器减1 没有返回值
4.retainCount :获取当前计数器
5.dealloc
* 当一个对象要被回收的时候,就会调用
*一定要调用[super dealloc] 且这句调用要放在最后面
person *p =[person alloc] init];
NSUInteger c = [p retainCount];
NSLog(@“%ld“, c ); 打印此时的计数器
- (void)dealloc //当一个对象被回收的时候, 就会自动调用这个方法
{
NSLog(@“对象被回收”);
//super的dealloc一定要调用. 而且放在最后面
[super dealloc];
}
2. 野指针. 僵尸对象
僵尸对象:计数器变为0后的对象成为僵尸对象
野指针: 指向僵尸对象. (不可用内存)的指针 (给野指针发送消息会报错)
空指针: 没有指向任何东西的指针 (存储的东西是nil, NULL , 0) 给空指针发送消息不会报错
3. retain方法是有返回值的, 会返回对象本身 相当于: [p retain] == p
经典报错:EXC_BAD_ACCESS: 访问了一块坏得内存(已经被回收, 已经不可用的内存)
二:
1. 你想使用(占用)某个对象, 就要你应该让对象计数器+! (让对象做一次retain操作)
2. 你不想再使用(占用)某个对象. 就应该让对象的计数器-1. (让对象做一次release)
3. 谁retain, 谁release
4. 谁alloc, 谁release
三:
内存管理代码规范:
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 release];
//3. 对新对象做一次retain
_car = [car retain];
}
}
3. deallob 方法的代码规范
1> 一定要[super dealloc], 而且放到最后面
2> 对self(当前) 所拥有的其他对象做一次release
- (void)dealloc
{
[_car release];
[super dealloc];
}
一. autorelease方法的基本用法:
1> autorelease方法会返回对象本身
2> 调用autorelease方法后, 对象改的计数器不变
3> autorelease会将对象放到一个自动释放池中
4> 当自动释放池被销毁时, 会对池子里面的所有对象做一次release操作
二. autorelease的好处:
1> 不用再关心对象释放的时间
2> 不用再关心什么时候调用release
三. autorelease的使用注意
1> 占用内存较小的对象不要随便使用autorelease
2> 占用内存较小的对象使用autorelease, 没有太大影响
四 错误写法
1> alloc之后调用了autorelease, 又调用了release
2> 连续调用多次autorelease
五 自动释放池
1> 在iOS程序运行过程中, 会创建无数个池子. 这些池子都是以栈结构存在(先进后出)
2> 当一个对象调用autorelease方法时. 会将这个对象放到栈顶的释放池
六 自动释放池的创建方式
1> iOS5.0 前
NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
[pool release];
2> iOS5.0开始
@autorelease
{
}
浙公网安备 33010602011771号