NSTimer使用总结(完)

上一篇的时候我们弄懂了 fire的用法,知道,它并不是启动一个定时器

继续讨论UITime类的其他方法:

Stopping a Timer
– invalidate

这个方法很容易让人误解,很容易认为他是让定时器暂停(语文没学好,或是英语没学好,嘿嘿),

官方的解释是:

This method is the only way to remove a timer from an NSRunLoop object. The NSRunLoop object removes and releases the timer, either just before the invalidate method returns or at some later point.

If it was configured with target and user info objects, the receiver releases its references to those objects as well.

意思是说:这是唯一一个把一个定时器从一个运行循环中移除的方法。NSRunLoop object这个对象移除,并且release掉这个的定时器,或者是在这个invalidate方法返回的之前或是在之后的某个时间段,再进行移除并release操作。


至此对于这个NSTimer类的学习,基本上,算是差不多了,一些基本功能能够实现了。至于深入,以后有项目需要的时候,再做深入研究吧。我感觉学习就是一个不断出错,不断学习,不断总结的简单事情,我其实把总结看的很重要,看似解决了一个问题,其实是一类,一大类问题,多花些时间也是值得地。我想以后在遇见此类问题,就比较有话语权,能够说的滔滔不绝。也会有解决问题的积累,举一反三。


对于这个项目,我不但学会了,弄清楚了,NSTimer这一个类的使用方法,而且让我对官方文档的严谨性,透彻性,有了进一步了解。有事没事多看API是一个好习惯。此次也是没有理解,英语的一些说明,才导致了一些小错误,再次感叹英语真的很重要啊!!!!!!!

由这个项目我也学会了内存管理的一些技巧,


- (IBAction)stopTime:(id)sender {


//如果_timer不等于nil   

    if (_timer) {
        NSLog(@"调用 self.time为真!!");
// 如果定时器在运行,我们就invalidate


//        if ([self.timer isValid]) {
//            NSLog(@"单击停止按钮,取消定时器!!");
//
//           [self.timer invalidate];
//           同时把他置为nil
//          _timer=nil; //这就是我要说的一个对象release和对象=nil的区别,内存管理
//            
//        }
    

//不加上面这个if判断也可以用下面这个,效果是一样的

        [self.timer invalidate];
        _timer=nil;//这个很重要

        
    }

}


关于对象release和对象=nil的区别,网上也有很多讨论,我也实际验证了一下,


个人认为  [对象 release] 后 这个对象就没有指向任何内存空间了,这个时候,它是不能被使用的(可以试试  NSLog 一下  release 后的对象,有惊喜的。。。)
当 对象 = nil 时,这个对象是指向了一个内存空间的( 0x0000,即开始地址),这个时候这个对象是可以被NSLog出来的。。。。。


如果一个对象alloc 一次并release后,以后是不能再使用的,它虽然也指向原来的内存空间,但其内容是不确定的,使用的话,它的内容有时候没事,但有时候会崩溃的。


下面这个例子可以很好地演示这个过程。


//我创建一个字符串对象

 NSString *string=[[NSString alloc] initWithFormat:@"henaho"];

        NSLog(@"对象release前的地址为:%p",string);
        NSLog(@"字符串内容为:%@",string);
//        string=nil;

     //使用之后我release

      [string release];
//       string=nil;
        
        if (string) {
            NSLog(@"release后对象指针不为nil");
        }else{
            
            NSLog(@"release后对象指针为nil");
        }
        NSLog(@"对象release后的内容为:%@",string);
        NSLog(@"对象release后的地址为:%p",string);


程序运行结果是: 啊 啊啊啊啊啊啊 这不是有正确结果吗????




我们在运行一次试试!!!!!!!崩溃啦啦啦!!!!












但当我们在release后一个对象后,将其=nil时,下面再用到的时候就不会出错了。


   [string release];
      string=nil;


看结果,是不是很神奇!!!!!





综上所述:一个好的编程习惯是,

[对象 release];

对象=nil;

这是一个好的作风,以后万一用到的时候也不会崩掉。自己的水平目

前就这么高,高深的也理解不了。慢慢进步……


好了,有一个定时器引发的血案终于可以结案了,开始研究NSTimer的时候感觉问题没这么多,但自己就是一个不断发现问题,并解决问题的人,看我终于解决了一些关键的问题,感觉自己的编程能力有了一个很大的提高,至少解决问题的能力,有了突飞猛进。学习的信心和动力一下子,呵呵……如果有哪位看到了,感觉有疑惑,我们可以一起学习,一起进步,一起解决问题的乐趣是无穷的。哈哈,不枉费我打这么多字和花费这么多时间来总结,我知道,在某一天,肯定会

受益的,当然受益的不仅仅是自己……






  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值