[iOS] iOS5から追加された新しい通知の有無を判定する

2011年11月19日土曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

例えば UIKeyboardWillChangeFrameNotification の通知を受け取りたい。普通に NSNotificationCenter へ登録すればいいのだが、iOS 4 でこれを実行するとクラッシュする。
この通知は iOS5 から導入された新しいもので iOS4 に無いのが原因。この通知名は NSString* const で定義されている。
// UIWindow.h

UIKIT_EXTERN NSString *const UIKeyboardWillChangeFrameNotification
     __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_5_0);

そこでこの定数の有無をチェックしたい。調べると Appleがドキュメントを出していた。

SDK Compatibility Guide: Using SDK-Based Development

この中に通知に関する記述がある(以下、引用)。
Check the availability of an external (extern) constant or a notification
name by explicitly comparing its address—and not the symbol’s bare name—to NULL or nil.

なるほど通知名のアドレスが NULLかどうかをチェックすれば良いらしい。さっきのコードはこう書ける。
if (&UIKeyboardWillChangeFrameNotification != NULL) {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(keyboardWillChangeFrame:)
                                                     name:UIKeyboardWillChangeFrameNotification
                                                   object:nil];

通知シンボルの前にアドレスを表す & を付けるのがポイント。これを忘れるとやっぱり EXC_BAD_ADDRESS でクラッシュ。

- - - - -
上述の Apple のリファレンスには他にも互換性を保つための実装情報が載っていて参考になる。






Responses

Leave a Response

人気の投稿(過去 30日間)