NSTimerは基本的にretainせずassignでよい
来源:互联网 发布:手机qq视频录像软件 编辑:程序博客网 时间:2024/05/11 01:52
From: http://akisute.com/2009/05/nstimerretainassign.html
NSTimerを初めて使ってみたのでハマったところをメモしておきます。
■NSTimerはNSRunLoopにretainされる。NSTimerは引数targetで与えられたオブジェクトをretainする。
いちばんハマったのがこの挙動です。
AppleのNSTimerについての公式ドキュメント(http://www.devworld.apple.com/documentation/Cocoa/Conceptual/Timers/Articles/usingTimers.html#//apple_ref/doc/uid/20000807-CJBJCBDE)にもクラスリファレンスにもきちんとと明記されていたのですが・・・思いっきり見落としてました。
これらがいったいどんな問題を引き起こすか。
たとえば普通のクラスと同じ感覚でdealloc中にNSTimerのinvalidateを呼び出すコードを書くと、永遠にdeallocが呼び出されなくなってしまいます。
そのまんまです。クラスリファレンスを見ても
■次のタイマーイベントまでの間隔をリセットしたいときはsetFireDate:
たとえば何らかの理由でタイマーのFireイベントに登録していたセレクタを自分で呼び出しちゃって、次のタイマーイベントまでの間隔をリセットしたいときなどは以下のような具合にするとよいです。
今このBlogを書くためにNSTimerでぐぐったらここに書いてあるようなことがいろいろ見つかってしまいました・・・><
先にちゃんと調べてから作らないと無駄ですね−。
NSTimerを初めて使ってみたのでハマったところをメモしておきます。
■NSTimerはNSRunLoopにretainされる。NSTimerは引数targetで与えられたオブジェクトをretainする。
いちばんハマったのがこの挙動です。
AppleのNSTimerについての公式ドキュメント(http://www.devworld.apple.com/documentation/Cocoa/Conceptual/Timers/Articles/usingTimers.html#//apple_ref/doc/uid/20000807-CJBJCBDE)にもクラスリファレンスにもきちんとと明記されていたのですが・・・思いっきり見落としてました。
これらがいったいどんな問題を引き起こすか。
たとえば普通のクラスと同じ感覚でdealloc中にNSTimerのinvalidateを呼び出すコードを書くと、永遠にdeallocが呼び出されなくなってしまいます。
// ViewControllerがNSTimerを使っているとして・・・- (void)viewDidLoad{ timer = [NSTimer scheduledTimerWithTimeInterval:interval target:self // このselfはretainされる selector:@selector(timerFired) userInfo:nil repeats:YES];}- (void)dealloc{ [displayLabel release]; [timerLabel release]; // ここでinvalidateしてはいけない、永遠にdealloc自体が呼び出されなくなる [timer invalidate]; [timer release];}なぜなら、
- NSTimerがdeallocを呼び出すオブジェクトをretainしている、したがってNSTimerがreleaseされるまでdeallocが呼ばれない
- NSTimerはNSRunLoopにretainされている、従ってNSTimerのinvalidateが実行されるまではNSTimerはreleaseされない
- invalidateを呼び出しているのはこのdeallocの中以外にない。・・・詰みました。
- NSTimerのオブジェクトは基本retainしない(自分でNSRunLoopにaddTimerとかしたい場合は別として)
- 通常deallocのタイミングでオブジェクトをreleaseするのと同じようにNSTimerをinvalidateしたい場合は、- (void)viewWillDisappear:(BOOL)animated を使う
- (void)viewWillDisappear:(BOOL)animated{ if (timer) { // ここでタイマーをinvalidateする // invalidateするとNSRunLoopがretainされていたこのタイマーをreleaseしてくれる [timer invalidate]; timer = nil; }}■userInfoはただのNSDictionary
そのまんまです。クラスリファレンスを見ても
The user info the new timer.としか書いてなくて困ったのですが、本当にただのNSDictionaryです。適当に使ってくれってことでしょうか。
This parameter may be nil.
■次のタイマーイベントまでの間隔をリセットしたいときはsetFireDate:
たとえば何らかの理由でタイマーのFireイベントに登録していたセレクタを自分で呼び出しちゃって、次のタイマーイベントまでの間隔をリセットしたいときなどは以下のような具合にするとよいです。
if (timer){ // timerのsetFireDateに、次にタイマーイベントが発生する日時をセットする // NSDateに、dateWithTimeIntervalSinceNowという便利なメソッドがあるのでこれを使う [timer setFireDate:[NSDate dateWithTimeIntervalSinceNow:interval]];}■っていうか
今このBlogを書くためにNSTimerでぐぐったらここに書いてあるようなことがいろいろ見つかってしまいました・・・><
先にちゃんと調べてから作らないと無駄ですね−。
- NSTimerは基本的にretainせずassignでよい
- retain/copy/assign的含义
- assign,retain,copy的用法
- retain/copy/assign的含义
- retain\assign\copy的区别
- assign、retain、copy的区别
- retain/copy/assign的含义
- retain copy assign 的区别
- assign,copy,retain的解释
- retain和copy还有assign的区别
- retain和copy还有assign的区别
- 对于Retain和Assign属性的理解
- nonatomic,assign,copy,retain的区别
- retain和copy还有assign的区别
- 对于Retain和Assign属性的理解
- retain和copy还有assign的区别
- [iOS]retain\assign\copy的区别
- nonatomic,assign,copy,retain的区别
- 关于jsp页面post传值汉字乱码的问题解决办法
- HDU2588解析
- iOS5 ARC学习笔记
- 黑马程序员_javaEE写一个简单的servlet
- Jquery和prototype冲突问题
- NSTimerは基本的にretainせずassignでよい
- 求三个数中的最大数 (分别考虑整数、双精度数、长整数)【函数的重载】
- 电容参数:X5R,X7R,Y5V,COG 详解
- @synchronized vs dispatch_once
- 函数模板】求两个整数 或者三个整数中的最大数 自动判断你输入的是几个整数
- AudioServicesPlaySystemSound音频服务—IOS开发
- You have tried to change the API from what has been previously approved
- Oracle order by 处理NULL值
- 【Oracle】树状结构查询