IOS开发基础Object-C(10)—OC内存管理(4)-autorelease使用

最想必大家近也是被内存管理整的焦头烂额,大家也就再痛苦这么一下,今天的autorelease已经是内存管理的最后一章了,今天的内容完成我们的内存管理也就先告一段落了。希望大家一定要理解内存管理,因为内存管理在OC中的地位可以说相当于C语言中的指针。虽然现在引进了ARC机制,但是大家也要理解内存管理的过程和原理,否则到时动不动来个内存泄露,而且还找不到错误所在,那感觉.....真(ri)是(le)爽(gou)啊(le)

我们先来理解一个概念:自动释放池(autorelease pool)


自动释放池(autorelease pool)

1、自动释放池是OC里面的一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放。

2、OC对象只要是发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶释放池),

3、autorelease其实就是对release延迟调用了,当自动释放池销毁时,释放池里面的所有对象会自动调用一次release方法(注意,是调用一次release方法

学过Java的应该知道,Java中有一个垃圾回收机制,这个内存回收机制其实和Java中的内存回收机制还是不一样的,Java中的垃圾回收机制是不需要我们手动管理内存的,它会自动检测我们的对象需不需要回收,要是这个对象没有被使用的时候,就会被回收。OC中的内存自动回收机制是不可能像Java那样自动检测回收的,还是需要我们手动,也可以说OC中的垃圾自动回收机制是 半自动的。为什么是半自动的呢?我们再来详细讲解一下。

老规矩,我们先来建一个Student类

Student.m

#import "Student.h"    
    
@implementation Student    
    
   
#pragma mark 回收对象    
- (void)dealloc{    
        
    NSLog(@"%@ 被销毁了", self);    
        
    [super dealloc]; 
}    
    
    
@end 

main.m

#import <Foundation/Foundation.h>  
#import "Student.h"  
  
  
   
int main(int argc, const char * argv[])  
{  
    
    //@autoreleasepool代表创建一个自动释放池
    @autoreleasepool {  
          
        Student *stu = [[Student alloc] init];  
          
        [stu autorelease];  
          
    } //在此处自动释放池销毁 
    return 0;  
}  

好,只要写了[stu autorelease],stu对象就能放到自动释放池里面了。到自动释放池销毁的时候,stu对象执行一次release。

我们在实际项目中一般这样写

@autoreleasepool {  
          
        Student *stu = [[[Student alloc] init]autorelease];  
          

    } //在此处自动释放池销毁

要注意:autorelease并不会改变引用计数器 的值,只是单单把对象放到自动释放池里面,到自动释放池销毁的时候,里面的所有对象统一执行一次release。也就是说自动释放池的销毁并不代表对象销毁,执行一次release只是让引用计数器-1,并不是被销毁。

autorelease pool 的创建

IOS 5.0后

@autoreleasepool {  
          
        //......

 }

IOS5.0以前

NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];

   //......

[pool release];


autorelease pool 的注意事项

1.在ARC下,不能使用NSAutoreleasePool创建自动释放池,应该用@autoreleasepool。

2.不要把大量的循环操作放到同一个自动释放池,会造成内存上升

3.避免对大内存使用该方法,应尽量少用这种延迟释放机制

4.SDK中一般利用静态方法创建并返回的对象都是已经autorelease的了,不需要再自动释放了


相关视频链接

http://pan.baidu.com/s/1eQBa5F0


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值