NSTimerクラス

2010. 10. 23
●概要

NSTimerクラスは、単純なタイマーやタイマーオブジェクトの生成に使用します。

タイマーは一定時間間隔で待機し、発動すると指定したメッセージを、ターゲットオブジェクトへ送信します。

例えば、ウィンドウにメッセージを送信するNSTimerオブジェクトを生成し、一定時間間隔で更新を伝えることができます。

タイマーは実行ループと連携して動きます。

タイマーを効果的に利用するには、実行ループの動作を理解している必要があります。
(『NSRunLoop』と『Threading Programming Guide』を参照)

特に、実行ループがタイマーを保持している場合、実行ループに追加したタイマーを後で解放するよう注意してください。

タイマーはリアルタイムの構造ではなく、実行ループモードの時のみ追加したタイマーが実行され、タイマーの発動時間が経過したかチェックをして、過ぎていれば発動します。

通常、実行ループの管理する様々な入力ソースの原因により、タイマーの有効な時間間隔の限界は50~100msecです。

もしタイマーの発動時間間隔より実行ループモードのタイマーの監視期間が長い場合は、実行ループがタイマーをチェックする次の時間まで発動しません。

従って、実際に発動可能な時間間隔で、タイマーの発動時間をスケジュールすることが重要です。

NSTimerオブジェクトには、『toll-free bridged』の対象としてCore FoundationのCFRunLoopTimerRef型があります。

これはFoudationオブジェクトを橋渡ししてCore Foundationの型に変換し、関数やメソッドで呼び出せることを意味します。

例えば、NSTimer *パラメータをメソッドで参照する際、CFRunLoopTimerRefに渡し、CFRunLoopTimerRefパラメータとして関数で参照でき、(コンパイラの警告を抑えるために型変換をして)NSTimerインスタンスに渡すこともできます。

Core Foundationのタイマーについては『CFRunLoopTimer Reference』を参照してください。

リピート対非リピートタイマー

タイマー生成時に、リピートか非リピートかを指定します。

非リピートタイマーの場合、発動は1回のみで自動的に無効になり、以降タイマーからの発動を防ぎます。

リピートタイマーは対照的に、同じ実行ループ上で自身を再スケジュールして発動します。

リピートタイマーは実際の発動時間と異なり、常に発動時間を自身でスケジュールします。

例えば、タイマー自身が常に5秒間隔で発動するスケジュールを立てても、実際には本来の5秒間隔よりも遅延した間隔で発動します。

発動時間が遅延し、発動時間のスケジュールが1回以上過ぎても、再スケジュールされた次の発動時間でのタイマーの発動は1回のみです。

実行ループでのタイマーのスケジューリング

実行ループ内に複数の実行ループモードが追加されていても、1回の実行ループで登録できるタイマーオブジェクトは1つだけです。

タイマーを生成するには以下の3通りがあります。

scheduledTimerWithTimeInterval:invocation:repeats:またはscheduledTimerWithTimeInterval:target:selector:userInfo:repeats:クラスメソッドを使用し、デフォルトモードで現在の実行ループにタイマーとスケジュールを生成する。

timerWithTimeInterval:invocation:repeats:またはtimerWithTimeInterval:target:selector:userInfo:repeats:クラスメソッドを使用して、タイマーオブジェクトの生成と実行ループ外でスケジューリングをする。
(後で、NSRunLoopオブジェクトに対応するaddTimer:forMode:メソッドでタイマーを追加生成し、実行ループで手動で呼び出す必要があります)

initWithFireDate:interval:target:selector:userInfo:repeats:メソッドを使用して、タイマーの生成と初期化をする。
(生成後、NSRunLoopオブジェクトに対応するaddTimer:forMode:メソッドでタイマーを追加生成し、実行ループで手動で呼び出す必要があります)

実行ループでスケジュールされるのは一度だけで、指定した間隔でタイマーが発動すると次回まで無効になります。

非リピートタイマーは、発動後すぐに自身でタイマーオブジェクトを無効にします。

しかしリピートタイマーは、invalidateメソッドを呼び出してタイマーオブジェクトを無効にする必要があります。

現在の実行ループからタイマーを除去するにはこのメソッドを呼び出せばいいのですが、タイマーを組み込んだ同じスレッドからinvalidateメソッドを常に呼び出す必要があります。

タイマーの無効化は直後のみ使用不可にするためのもので、実行ループで長く作用しません。

invalidateメソッドが戻る直前か少し後の時点で、実行ループはタイマーを除去・解放します。

一度無効にしたタイマーオブジェクトは再利用することはできません。



●タスク

●タイマーの生成

+ scheduledTimerWithTimeInterval:invocation:repeats:
+ scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:
+ timerWithTimeInterval:invocation:repeats:
+ timerWithTimeInterval:target:selector:userInfo:repeats:
– initWithFireDate:interval:target:selector:userInfo:repeats:

●タイマーの発動

– fire

●タイマーの停止

– invalidate

●タイマーに関する情報

– isValid
– fireDate
– setFireDate:
– timeInterval
– userInfo



●クラスメソッド

scheduledTimerWithTimeInterval:target:selector:userInfo:repeats:

+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)seconds target:(id)target selector:(SEL)aSelector userInfo:(id)userInfo repeats:(BOOL)repeats

デフォルトモードの現在の実行ループの中に新規にNSTimerオブジェクトを作成し、返します。

seconds:タイマーの発動間隔を秒単位で指定します。
0.0秒以下を指定した場合は0.1ミリ秒に補正されます。

target:タイマーの発動時にaSelectorのメッセージを送るオブジェクトを指定します。
このオブジェクトは、タイマーが解放されるまで保持されます。

aSelector:タイマーの発動時にtargetに送るメッセージを指定します。
セレクタは次のような記述になります。

- (void)timerFireMethod:(NSTimer *)theTimer

このメソッドの引数としてタイマーは自分自身を渡します。

userInfo:タイマーがaSelectorのメソッドに渡すユーザ情報を指定します。
このオブジェクトは、タイマーが解放されるまで保持されます。
このパラメータはnilを指定できます。

repeats:YESの場合は無効にするまでタイマー動作を繰り返します。
NOの場合は一度だけタイマー動作を発動します。



●インスタンスメソッド

invalidate

- (void)invalidate

レシーバのタイマーを要求があるまで、再発動の停止および実行ループからの削除をします。

このメソッドはNSRunLoopオブジェクトからタイマーを除去する唯一の方法です。

NSRunLoopオブジェクトは、invalidメソッドが返す直前か少し後の時点でタイマーの除去と解放を行います。

ターゲットとユーザ情報オブジェクトと共に構成されている場合、レシーバは参照しているこれらのオブジェクトも解放します。

特別な考慮事項

このメッセージは、タイマーを設置しているスレッドからメッセージを送る必要があります。

このメッセージを他のスレッドから送信した場合、入力ソースに関連付けられているタイマーが実行ループから除去されず、スレッドが適切に終了できなくなります。


setFireDate:

- (void)setFireDate:(NSDate *)date

レシーバで設定されている発動時間を再設定します。

このメソッドは通常、リピートタイマーの発動時間の調整に使用します。

タイマーの次の発動時間を再設定は比較的高くつく操作ですが、いくつかの状況では効率的です。

例えば、不規則な時間間隔で、複数の時刻に動作を繰り返す状況では有効です。

1つの実行ループのスケジューリングの中で複数のタイマーオブジェクトを作成・破棄をするより、1つのタイマーの発動時間を調整した方がよりコストを少なくできます。

無効になっているタイマーや、発動済みの非リピートタイマーでこのメソッドを呼び出さないでください。

ただし、スレッドに常に接続されている潜在的な競合状況を避けるためのタイマーの場合、未発動の非リピートタイマーからこのメソッドを潜在的に呼び出すことができます。

date:新しく再設定する発動の日時を指定します。
新しい日付が既に過ぎていた場合、このメソッドは現在の時刻を発動時間に設定します。



参考文献

NSTimer Class Reference






Bose SoundSport wireless headphones
0 Comments
Leave a comment
管理者にだけ表示を許可する
Top
0 Trackbacks
Top
Calendar
02 | 2017/03 | 03
Sun Mon Tue Wed Thu Fri Sat
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -
Recent Articles
iTunes


Swift
Categories
Tips
WACOM


Reference
NSApplicationDelegateプロトコル
NSArrayクラス
NSAutoreleasePoolクラス
NSBundleクラス
NSBundle UIKit追加分
NSCalendarクラス
NSCoderクラス
NSCodingプロトコル
NSCopyingプロトコル
NSDataクラス
NSDateクラス
NSDateFormatterクラス
NSDictionaryクラス
NSEntityDescriptionクラス
NSEnumeratorクラス
NSErrorクラス
NSExceptionクラス
NSFetchRequestクラス
NSFileHandleクラス
NSFileManagerクラス
NSIndexPathクラス
NSIndexPath UIKit追加分
NSKeyedArchiverクラス
NSKeyedUnarchiverクラス
NSKeyValueCodingプロトコル
NSLocaleクラス
NSManagedObjectクラス
NSManagedObjectContextクラス
NSManagedObjectModelクラス
NSMutableArrayクラス
NSMutableCopyingプロトコル
NSMutableDictionaryクラス
NSMutableSetクラス
NSNotificationクラス
NSNotificationCenterクラス
NSNullクラス
NSNumberクラス
NSObjectクラス
NSObject UIKit追加分
NSObjectプロトコル
NSPersistentStoreクラス
NSPersistentStoreCoordinatorクラス
NSPredicateクラス
NSPropertyListSerializationクラス
NSRunLoopクラス
NSSetクラス
NSStringクラス
NSString UIKit追加分
NSTimerクラス
NSTimeZoneクラス
NSURLクラス
NSURLProtectionSpaceクラス
NSURLRequestクラス
NSUserDefaultsクラス
NSValueクラス

UIActionSheetクラス
UIActionSheetDelegateプロトコル
UIActivityIndicatorViewクラス
UIAlertViewクラス
UIAlertViewDelegateプロトコル
UIApplicationクラス
UIApplicationDelegateプロトコル
UIBarButtonItemクラス
UIBarItemクラス
UIButtonクラス
UIColorクラス
UIControlクラス
UIDatePickerクラス
UIDeviceクラス
UIEventクラス
UIFontクラス
UIGestureRecognizerクラス
UIImageクラス
UIImageViewクラス
UIKit Function
UILabelクラス
UINavigationControllerクラス
UINavigationItemクラス
UIPickerViewクラス
UIPickerViewDataSourceプロトコル
UIPickerViewDelegateプロトコル
UIPinchGestureRecognizerクラス
UIResponderクラス
UIScreenクラス
UIScrollViewクラス
UISearchBarクラス
UISearchBarDelegateプロトコル
UISegmentedControlクラス
UISliderクラス
UISwipeGestureRecognizerクラス
UISwitchクラス
UITableViewクラス
UITableViewCellクラス
UITableViewControllerクラス
UITableViewDataSourceプロトコル
UITableViewDelegateプロトコル
UITapGestureRecognizerクラス
UITextFieldクラス
UITextFieldDelegateプロトコル
UITextInputTraitsプロトコル
UITextViewクラス
UITextViewDelegateプロトコル
UIToolbarクラス
UITouchクラス
UIViewクラス
UIViewControllerクラス
UIWebViewクラス
UIWebViewDelegateプロトコル
UIWindowクラス

AVAudioPlayerクラス
AVAudioPlayerDelegateプロトコル

CADisplayLinkクラス
CAEAGLLayerクラス
CALayerクラス

CGAffineTransform
CGBitmapContext
CGColor
CGColorSpace
CGContext
CGGeometry
CGImage
CGPath

EAGLContextクラス
EAGLDrawableプロトコル

Foundation Constants
Foundation Data Types
Foundation Functions

MPMediaItemクラス
MPMediaItemArtworkクラス
MPMediaPlaylistクラス
MPMediaPropertyPredicateクラス
MPMediaQueryクラス
MPMusicPlayerControllerクラス

Randomization Services

System Sound Services
BOSE

Bose SoundSport wireless headphones
ARC
Technical Q&A
情報プロパティリストキー
Start Developing iOS Apps Today
SQLite
OpenGL ES
Amazon


Monthly Archives
Recent Comments
Recent TrackBacks
RSS Link
Profile

Author:水月杏香
永遠の初心者プログラマ。

QR Code
QR
Visitors