2009-11-08 19 views
6

उद्देश्य-सी गतिशील बाध्यकारी का उपयोग करता है: यह विधि कॉल रनटाइम पर हल हो जाती है।गतिशील बाध्यकारी झूठ की तरह लगता है

ठीक है।

और use of dot notation really boils down to a method call

लेकिन, क्यों तो, मैं कुछ इस तरह नहीं कर सकते:

 
#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) { 
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 


    // Intercept the exception 
    @try 
    { 
    @throw [ NSException 
      exceptionWithName:@"Exception named ME!" 
      reason:@"Because i wanted to" 
      userInfo:nil ] ; 
    } 
    @catch(id exc) // pointer to an exception object? 
    { 



    //NSLog(@"%@ : %@\n", exc.name, exc.reason) ; // ILLEGAL: Request for member 
    // 'name' in something not a structure or union.. 
    // If objective-c uses dynamic binding, and dot notation 
    // boils down to calling the getter, then 
    // WHY do I have to cast to the concrete type here? 

    // Only works if I cast to the concrete type NSException* 
    NSException* nexc = (NSException*)exc ; 
    NSLog(@"%@ : %@\n", nexc.name, nexc.reason) ; 



    } 



    [pool drain]; 
    return 0; 
} 

जब मैंने सुना है "बंधन गतिशील" मैं "सोच रहा हूँ तो यह एक तरह से व्यवहार करना चाहिए स्क्रिप्टिंग भाषा ", और मुझे हैरान है कि कैसे लचीला उद्देश्य-सी जावास्क्रिप्ट जैसी एक स्क्रिप्टिंग भाषा की तुलना में लगता है।

+2

आप केक के साथ गतिशील बाध्यकारी उलझन में हैं। यह एक झूठा वायदा है। –

+1

_ "रनटाइम पर विधि कॉल का समाधान किया गया है" _ को वास्तव में _ "संदेश प्रेषण रनटाइम पर होता है" _। पूरा _dot ऑपरेटर_ उपयोग किसी और चीज़ की तुलना में हैक से अधिक है। –

+2

इसके बारे में कुछ भी हैकिश नहीं है; यह एक अतिरिक्त कॉल के साथ एक विधि कॉल के लिए एक बहुत अच्छी तरह से परिभाषित समानार्थी है कि प्रकार अच्छी तरह से जाना जाना चाहिए। (चाहे कोई डॉट पसंद करता हो या सोचता है कि यह एक अच्छा जोड़ा है पूरी तरह राय है - कोई टिप्पणी नहीं :)। – bbum

उत्तर

17

आप रनटाइम और कंपाइलर को भ्रमित कर रहे हैं। रनटाइम में इसके साथ मुकाबला करने में कोई समस्या नहीं है। मुद्दा यह है कि डॉट नोटेशन (जो वाक्य रचनात्मक चीनी है) को कंपाइलर के उद्देश्य-सी ऑब्जेक्ट्स और सी structs के बीच असंबद्ध करने के लिए प्रकार की जानकारी की आवश्यकता होती है।

आप डॉट संकेतन का उपयोग नहीं करते हैं तो यह काम करता है:

NSLog(@"%@ : %@\n", [exc name], [exc reason]) ; 

ऊपर एक चेतावनी उत्पन्न होगा अगर प्रकार id के बाद से संकलक जानता है कि यह प्रकार पता करता है और प्रेषण गारंटी नहीं दे सकते नहीं है काम करेगा, लेकिन यह संकलित और चलाएगा।

मूल रूप से हाथ में समस्या यह है कि संकलक को यह पता होना चाहिए कि संरचना लोड उत्पन्न करना है या किसी उद्देश्य सी प्रेषण को दूसरे शब्दों में, डॉट नोटेशन के साथ किसी ऑब्जेक्ट के बीच अंतर निर्धारित करने के लिए पर्याप्त जानकारी होनी चाहिए स्केलर प्रकार।

0

उद्देश्य-सी गतिशील बाध्यकारी का समर्थन करता है। हालांकि, आप 'id' प्रकार की वस्तुओं पर गुणों का उपयोग नहीं कर सकते हैं - लेकिन आप इसे अपने इच्छित संदेश भेज सकते हैं। (यह शायद वर्तमान परिभाषा/कार्यान्वयन में एक गलती है ... लेकिन चलो अब के लिए अलग है कि छोड़ दें।)

यदि आपने ऐसा किया

NSLog(@"%@ : %@", [exc name], [exc reason]); 

तो यह काम करेगा। ध्यान दें कि आपको NSLog कथन पर एक नई लाइन डालने की आवश्यकता नहीं है, क्योंकि वे सभी अलग-अलग लाइनों पर हैं।

+2

सुनिश्चित करें कि आप bbum के उत्तर को पढ़ लें। कार्यान्वयन एक गलती नहीं है, बल्कि उद्देश्य पर है। – danimal

+0

पर्याप्त मेला, एक ही समय के आसपास जवाब दिया होगा :-) – AlBlue

17

गतिशील बाध्यकारीगतिशील टाइपिंग के समानार्थी नहीं है। सी एक दृढ़ता से टाइप की गई भाषा है और, विशेष रूप से, तर्क या वापसी मूल्य का प्रकार महत्वपूर्ण है और कोड उत्पादन को महत्वपूर्ण रूप से प्रभावित कर सकता है।

गुण विशेष रूप से अस्पष्टता को खत्म करने के लिए डिज़ाइन किए गए हैं। इसके एक हिस्से के रूप में, निर्णय पर बनाया गया था id के खिलाफ डॉट सिंटैक्स का उपयोग करने की अनुमति दें।

विशेष रूप से, यह इस स्थिति के पते: दो अलग-अलग हेडर फाइल में ऊपर

@interface Foo 
- (short) length; 
@end 

@interface Bar 
- (unsigned long long) length; 
@end 

को देखते हुए, [anObject length] का संकलन एक चेतावनी केवल दोनों हेडर फाइल आयात किया गया है दे देंगे। अगर केवल एक हेडर फ़ाइल आयात की गई है, तो कॉल साइट को हेडर में दिखाई देने वाले प्रकार को वापस संकलित किया जाएगा। यदि कॉल साइट अन्य विधि के लिए थी, तो एक बहुत ही अप्रत्याशित परिणाम वापस कर दिया जाएगा।

डॉट सिंटैक्स पर सीमा इस संभावित अस्पष्टता को समाप्त करती है। यही कारण है कि आप आमतौर पर विधियों की सह-भिन्न घोषणाएं नहीं देखते हैं। सी एबीआई सिर्फ इसका समर्थन नहीं करता है (इसके साथ ही, उद्देश्य-सी ऑब्जेक्ट प्रकार सह-भिन्नता का समर्थन करने का एक खराब काम करता है)।

हकीकत में, उद्देश्य-सी डेवलपर्स शायद ही कभी id प्रकार का उपयोग करते हैं। विशिष्ट प्रकार की घोषणाएं संकलक को कोड कोड सत्यापन में काफी सुधार करने में सक्षम बनाती हैं।

+0

सामान्य के रूप में उत्कृष्ट जवाब, बिल! डिजाइन निर्णयों के ब्योरे के बारे में जानना हमेशा अच्छा होता है। और मैं मानता हूं, मैं 'आईडी' का उपयोग कम से कम करता हूं, क्योंकि जब मैं इसे प्राप्त कर सकता हूं तो अक्सर स्थिर टाइपिंग के लाभ पसंद करते हैं। –

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