码迷,mamicode.com
首页 > 其他好文 > 详细

NSTimer

时间:2016-04-17 20:51:25      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

 

http://my.oschina.net/u/2340880/blog/398598

雪花定时器

- (void)awakeFromNib

{

    // 添加定时器 0.1  0.35

   //    [NSTimer scheduledTimerWithTimeInterval:0.01 target:self selector:@selector(timeChange) userInfo:nil repeats:YES];

   // 一般如果定时器调用频率非常高,<1s,通常不会使用NSTimer,NSTimer调用优先级不高,NSTimer在重绘的时候也不要使用

    CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(setNeedsDisplay)];

        [link addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

}

 

//- (void)timeChange

//{

//    // setNeedsDisplay 这个方法并不会马上调用 drawRect方法,仅仅是给当前视图做一个重绘标记,当下一次屏幕刷新的时候就会调用drawRect方法

//    [self setNeedsDisplay];

//}

 

static int _snowY = 0;

 

- (void)drawRect:(CGRect)rect {

    // Drawing code

   UIImage *image = [UIImage imageNamed:@"雪花"];

    [image drawAtPoint:CGPointMake(50, _snowY)];

     _snowY += 10;

     if (_snowY > rect.size.height) {

        _snowY = 0;

    } 

}

 

关于内存释放

  如果我们启动了一个定时器,在某个界面释放前,将这个定时器停止,甚至置为nil,都不能是这个界面释放,原因是系统的循环池中还保有这个对象。所以我们需要这样做:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
-(void)dealloc{
    NSLog(@"dealloc:%@",[self class]);
}
- (void)viewDidLoad {
    [super viewDidLoad];
    timer= [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(myLog:) userInfo:nil repeats:YES];
    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 100, 100)];
    btn.backgroundColor=[UIColor redColor];
    [btn addTarget:self action:@selector(btn) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:btn];
}
-(void)btn{
    if (timer.isValid) {
        [timer invalidate];
    }
    timer=nil;
    [self dismissViewControllerAnimated:YES completion:nil];
}

在官方文档中我们可以看到 [timer invalidate]是唯一的方法将定时器从循环池中移除。

  

NSTimer

标签:

原文地址:http://www.cnblogs.com/jiayongqiang/p/5401983.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!