2013-06-05 8 views
6

में फ्रेमवर्क मैं केवल AVFoundation.Framework के नमूना कोड के माध्यम से जा रहा हूं ->AVSimpleEditoriOS & मुझे निम्न पंक्ति मिली जो मुझे समझ में नहीं आया।AVFoundation में स्थिर शून्य सूचक। नमूना कोड

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

दो पंक्तियों से ऊपर

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

निम्नलिखित पर विचार, मैं पता लगा सकते हैं कि उन 2 static void/कुछ फैंसी नाम के साथ सामान्य संकेत दिए गए हैं।

अब वापस उन 2 लाइनों के लिए, मैं इसे यहाँ फिर से चिपकाने कर रहा हूँ,

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

ऊपर मतलब है, 2 static void/सामान्य उसके अपने & के संदर्भ भंडारण संकेत दिए गए कारण है कि यह क्या अर्थ में की जरूरत होगी है?

मुझे ऐसे कोडिंग पैटर्न को जानने के लिए बस थोड़ी सी मार्गदर्शिका चाहिए। ज्ञान के लिए प्रतीक्षारत।

उत्तर

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]; 
    } 
} 
पर भेजा गया मान

(वैकल्पिक रूप से, पैरामीटर observeValueForKeyPath में पैरामीटर देख सकता है।) नीचे देखें 'बेवारियस' टिप्पणी के लिए क्यों अद्वितीय संदर्भ बिंदुओं को आम पथ तारों पर आम तौर पर पसंद किया जाता है।

+0

क्या इसका मतलब है - हम इसे संदर्भ के रूप में पास कर रहे हैं (डेटाबेस में रिकॉर्ड की एक अद्वितीय आईडी की तरह) और आंतरिक ढांचे से प्रतिक्रिया प्राप्त करते समय, हम संदर्भ के लिए प्रतिक्रिया की पहचान कर सकते हैं? –

+1

@ स्पार्क: हाँ, बिल्कुल। 'AddObserver' के संदर्भ पैरामीटर को पॉइंटर वैरिएबल की आवश्यकता होती है, इसलिए यह एक अद्वितीय पॉइंटर चर बनाने का एक सुविधाजनक तरीका है। - मैंने विचार को और स्पष्ट करने के लिए थोड़ा सा जवाब बढ़ा दिया है। –

+4

बस एक नोट: अद्वितीय संदर्भ पॉइंटर्स को आम तौर पर कुंजी पथ तारों पर प्राथमिकता दी जाती है क्योंकि यह संभव है कि सुपरक्लास में से एक भी उसी कुंजी पथ को देख रहा हो। –

संबंधित मुद्दे