2013-06-05 1 views
6

サンプルコードAVFoundation.Framework - >AVSimpleEditoriOS &私は理解できない次の行を見つけました。サンプルコードのAVFoundation.Frameworkの静的voidポインタ

static void *AVSEPlayerItemStatusContext = &AVSEPlayerItemStatusContext; 
static void *AVSEPlayerLayerReadyForDisplay = &AVSEPlayerLayerReadyForDisplay; 

が二行以上

static void *AVSEPlayerItemStatusContext = nil; 
static void *AVSEPlayerLayerReadyForDisplay = nil; 

を以下の点を考慮、私はそれらのいくつかの派手な名前を持つ2静的な無効/汎用のポインタであることを把握することができます。

は今戻って、これらの2行に、私は再びそれをここに貼り付けています、

static void *AVSEPlayerItemStatusContext = &AVSEPlayerItemStatusContext; 
static void *AVSEPlayerLayerReadyForDisplay = &AVSEPlayerLayerReadyForDisplay; 

は、それがどのような意味で必要とされるであろう、なぜそれ自身&の参照を格納2の静的な無効/ジェネリックポインタ、上記意味するのでしょうか?

私はこのようなコードパターンを学ぶためのガイドはほとんど必要ありません。 知識を待っています。

答えて

6

自己参照ポインタ

static void *foo = &foo; 

は、コンパイル時に一意ポインタを作成するだけ方法です。その"AVSimpleEditoriOS"サンプルプロジェクトで

は、これらのポインタは、後で

[self addObserver:self forKeyPath:@"player.currentItem.status" options:NSKeyValueObservingOptionNew context:AVSEPlayerItemStatusContext]; 

[self addObserver:self forKeyPath:@"playerLayer.readyForDisplay" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:AVSEPlayerLayerReadyForDisplay]; 

ためcontextパラメータとして使用されているコンテキストパラメータの実際の値は全く関係ない、それだけですいくつかのユニークな 値が

に渡されます
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if (context == AVSEPlayerItemStatusContext) { 
     // Notification for @"player.currentItem.status" 
     // ... 
    } else if (context == AVSEPlayerLayerReadyForDisplay) { 
     // Notification for @"playerLayer.readyForDisplay" 
     // ... 
    } else { 
     // Something else, pass to superclass: 
     [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; 
    } 
} 

keyPathのパラメータを observeValueForKeyPathにチェックしてもかまいません。 キーパス文字列よりも一意のコンテキストポインタが一般的に好まれる理由は以下の@Bavariousのコメントを参照してください。

+0

内部フレームワークからの応答を受け取ったときに、コンテキストの応答を識別できますか?(データベースのレコードの一意のIDと同じように)コンテキストとして渡していますか? –

+1

@スパーク:はい、そうです。 'addObserver'のコンテキストパラメータはポインタ変数を必要とするので、これは一意のポインタ変数を作成する便利な方法です。 - 私はアイデアをより明確にするために答えを少し広げました。 –

+4

ちょうど1つの注記:スーパークラスの1つが同じキーパスを観察している可能性があるため、一般に一意のコンテキストポインタがキーパス文字列よりも優先されます。 –

関連する問題