2010-04-23 13 views
31
  1. यदि आप ऑब्जेक्ट (पॉइंटर) पर कोई विधि कहते हैं तो उद्देश्य-सी में सामान्य व्यवहार क्या है (शायद क्योंकि कोई इसे प्रारंभ करना भूल गया है)? क्या यह किसी प्रकार की त्रुटि उत्पन्न नहीं कर सकता है (विभाजन गलती, शून्य सूचक अपवाद ...)?
  2. यदि यह सामान्य व्यवहार है, तो क्या इस व्यवहार को बदलने (संकलक को कॉन्फ़िगर करके) बदलने का कोई तरीका है ताकि प्रोग्राम रनटाइम पर किसी प्रकार की त्रुटि/अपवाद उठा सके?

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

@interface Person : NSObject { 

    NSString *name; 

} 

@property (nonatomic, retain) NSString *name; 

- (void)sayHi; 

@end 

:

इस वर्ग के होने के कार्यक्रम में

@implementation Person 

@synthesize name; 

- (void)dealloc { 
    [name release]; 
    [super dealloc]; 
} 

- (void)sayHi { 
    NSLog(@"Hello"); 
    NSLog(@"My name is %@.", name); 
} 

@end 

कहीं मैं यह कर:

Person *person = nil; 
//person = [[Person alloc] init]; // let's say I comment this line 
person.name = @"Mike";   // shouldn't I get an error here? 
[person sayHi];     // and here 
[person release];     // and here 

उत्तर

57

एक संदेश एक nil वस्तु के लिए भेजा पूरी तरह से है उद्देश्य-सी में स्वीकार्य है, इसे नो-ऑप के रूप में माना जाता है। इसे त्रुटि के रूप में फ़्लैग करने का कोई तरीका नहीं है क्योंकि यह कोई त्रुटि नहीं है, वास्तव में यह भाषा की एक बहुत ही उपयोगी विशेषता हो सकती है।

docs से:

संदेश भेजा जा रहा है नहीं के बराबर

को ऑब्जेक्टिव-सी में, यह करने के लिए एक संदेश भेजने के लिए मान्य है शून्य-यह बस रनटाइम पर कोई प्रभाव नहीं है। कोको में के कई पैटर्न हैं जो इस तथ्य का लाभ उठाते हैं। एक संदेश से नहीं के बराबर करने के लिए दिए गए मान भी मान्य हो सकता है:

  • विधि, एक वस्तु है, तो एक संदेश nil रिटर्न 0 (nil) को भेजा रिटर्न, उदाहरण के लिए:

    Person *motherInLaw = [[aPerson spouse] mother];

    तो aPerson के spousenil है, तो mothernil औरको भेजा जाता हैविधि nil देता है।

  • विधि किसी भी सूचक प्रकार, आकार की तुलना में कम या sizeof(void*) के बराबर में से किसी पूर्णांक अदिश देता है, तो एक float, एक double, एक long double, या एक long long, तो संदेश nil रिटर्न 0 को भेजा ।

  • विधि देता है, तो एक struct, के रूप में मैक ओएस एक्स ABI फ़ंक्शन कॉल गाइड द्वारा परिभाषित रजिस्टरों में लौटा दी है, तो संदेश nil रिटर्न 0.0 के लिए हर क्षेत्र के लिए डेटा संरचना में भेज दिया है। अन्य struct डेटा प्रकार शून्य से भरे नहीं जाएंगे।

  • यदि विधि उपर्युक्त मूल्य प्रकार के अलावा कुछ भी लौटाती है तो संदेश के वापसी मूल्य को शून्य पर भेजा गया है।

+2

और मैं किसी भी तरह से इस व्यवहार को बदलने के लिए के बारे में पता नहीं कर रहा हूँ। यह उद्देश्य-सी/कोको के साथ प्रोग्रामिंग का एक मौलिक हिस्सा है। आप इसे प्यार करना सीखेंगे। –

+0

उत्तर में दस्तावेज़ से लिंक मृत है (* पृष्ठ नहीं मिला *)। – Pang

6

एक बात आप पर स्पष्ट किया जाना चाहिए कि ऑब्जेक्टिव-सी में, तुम नहीं कॉल एक वस्तु पर एक विधि है, तो आप एक वस्तु को एक संदेश भेज । रनटाइम विधि पायेगा और इसे कॉल करेगा।

उद्देश्य-सी के पहले संस्करणों के बाद से, शून्य के लिए एक संदेश हमेशा एक सुरक्षित नो-ऑप रहा है जो शून्य लौटाता है। बहुत सारे कोड हैं जो इस व्यवहार पर निर्भर करते हैं।

12

Greg Parker के site से:

तो LLVM संकलक 3.0 (Xcode 4.2) या उसके बाद वाला

 
Messages to nil with return type | return 
Integers up to 64 bits   | 0 
Floating-point up to long double | 0.0 
Pointers       | nil 
Structs       | {0} 
Any _Complex type    | {0, 0} 
संबंधित मुद्दे