注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

ksnowlv的博客

积土成丘,集腋成裘,坚持再坚持!

 
 
 

日志

 
 

关于运行循环(1)  

2013-04-02 17:39:00|  分类: IOS_其它 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

本篇主要是测试运行循环对内存释放的影响.先随意定义两个类如下


@interface QCar : NSObject


@end


@implementation QCar


- (void)dealloc

{

    [super dealloc];

    NSLog(@"car dealloc");

}


@end


@interface QCarInfo : NSObject


- (void)createCar;


@end

@implementation QCarInfo


- (void)dealloc

{

    [super dealloc];

    NSLog(@"carInfo dealloc");

}



- (void)createCar

{

    NSLog(@"create Car!!!");

    [[[QCar alloc] init] autorelease];

}


@end


然后添加运行循环的测试CODE如下:

- (void)testAutoReleasePool

{

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


    QCarInfo* carInfo = [[QCarInfo alloc] init];

    NSDate *now = [[NSDate alloc] init];

    NSTimer *timer = [[NSTimer alloc] initWithFireDate:now

                                              interval:5

                                                target:carInfo

                                              selector:@selector(createCar)

                                              userInfo:nil

                                               repeats:NO];

    NSRunLoop *runLoop = [NSRunLoop currentRunLoop];

    [runLoop addTimer:timer forMode:NSDefaultRunLoopMode];

    [timer release];

    [now release];


    [carInfo autorelease];

    NSLog(@"aa");

    [pool release];

    NSLog(@"ab");

  

}


运行结果如下:

2013-04-02 17:10:00.450 test[15704:c303] aa

2013-04-02 17:10:00.451 test[15704:c303] ab

2013-04-02 17:10:00.452 test[15704:c303] create Car!!!

2013-04-02 17:10:00.452 test[15704:c303] car dealloc

2013-04-02 17:10:00.453 test[15704:c303] carInfo dealloc


为什么会出现如上结果呢?

1.定时器创建时,持有了carInfo对象,自动释放内存池释放时,carInfo对象还被定时器持有。

2.TIMER被加入到Runloop后,Runloop持有TIMER,因为是从当前时间开始计算(可以把时间后延),createCar事件立即执行。

3.由于TIMER不是重复触发的,createCar事件执行完后,Runloop释放TIMER,TIMER会释放carInfo的所有权,此时carInfo的 dealloc被调用。


如果把定时器修改成重复调用的话,

运行结果如下:

2013-04-02 17:25:43.735 test[17002:c303] aa

2013-04-02 17:25:43.736 test[17002:c303] ab

2013-04-02 17:25:43.737 test[17002:c303] create Car!!!

2013-04-02 17:25:43.737 test[17002:c303] car dealloc

2013-04-02 17:25:48.736 test[17002:c303] create Car!!!

2013-04-02 17:25:48.737 test[17002:c303] car dealloc

2013-04-02 17:25:53.735 test[17002:c303] create Car!!!

2013-04-02 17:25:53.736 test[17002:c303] car dealloc


carInfo永远得不到释放,

分析原因如下:Runloop retain TIMER,而TIMER retain carInfo,造成carInfo永远得不到释放


如果释放定时器调整为:    

[timer invalidate];//invalidate 的调用会使得timer被release

[timer release];

或者去掉运行循环

运行结果如下:

2013-04-02 17:28:41.126 test[17416:c303] aa

2013-04-02 17:28:41.128 test[17416:c303] carInfo dealloc

2013-04-02 17:28:41.128 test[17416:c303] ab

create Car!!!和car dealloc并没有得到调用,那是因为TIMER立即被销毁了,carInfo的createCar就没有机会得到调用。

  评论这张
 
阅读(85)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018