2012-03-16 13 views
39

मैं समझ नहीं क्यों मैं लाइन जहां NSAssert है परअजीब त्रुटि NSAssert

use of undeclared identifier _cmd did you mean rcmd 

मिलता है।

#import <Foundation/Foundation.h> 

int main (int argc, const char * argv[]) 
{ 

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
    int x = 10; 

    NSAssert(x > 11, @"x should be greater than %d", x); 

    [pool drain]; 
    return 0; 
} 

उत्तर

95

हर ऑब्जेक्टिव-सी विधि के अंदर दो छिपा चर id self और SEL _cmd

हैं तो

- (void)foo:(id)bar; 

वास्तव में

void foo(id self, SEL _cmd, id bar) { ... } 

है और जब आप

[someObject foo:@"hello world"] 
फोन

यह वास्तव में

foo(someObject, @selector(foo), @"hello world") 

आप इसे की परिभाषा के लिए कूद करने के लिए आप यह है कि यह एक मैक्रो विधि आप से यह बुला रहे हैं की _cmd छिपा चर का उपयोग करता है देखेंगे NSAssert पर cmd-क्लिक करें, तो है। इसका अर्थ यह है कि यदि आप किसी उद्देश्य-सी विधि (शायद आप 'मुख्य' में हैं) के अंदर नहीं हैं, इसलिए आपके पास _cmd तर्क नहीं है, तो आप एनएसएएसएसर्ट का उपयोग नहीं कर सकते हैं।

इसके बजाय आप वैकल्पिक एनएससीएएसएसर्ट का उपयोग कर सकते हैं।

+0

वास्तव में अच्छी व्याख्या ... और मैंने उद्देश्य-सी के बारे में कुछ सीखा! NSCAssert के लिए – Robert

+0

+1 – onmyway133

0

यदि आप स्वरूप पैरामीटर का उपयोग करना चाहते हैं तो आपको अपनी स्ट्रिंग को एनएसएसटींग क्लास में लपेटना होगा। ऐसा इसलिए है क्योंकि @"" एक सादा एनएसएसटींग के लिए एक डिफ़ॉल्ट कन्स्ट्रक्टर है। जिस तरह से यह लिखा गया है अब NSAssert फ़ंक्शन और इसके साथ गड़बड़ करने का तीसरा पैरामीटर देता है।

NSAssert(x > 11, [NSString stringWithFormat:@"x should be greater than %d", x]); 
+0

मुझे वही त्रुटि मिलती है यदि मैं कोड को एनएसएएसएसर्ट में बदलता हूं (x> 11, @ "x से अधिक होना चाहिए"); – foho

+0

@ हाइलीकाफिनेटेड का उत्तर वह है जिसे मैं अभी तक पहुंचा हूं। – Alexander

1

को बदलने के लिए

NSAssert कोशिश (एक्स> 11, [NSString stringWithFormat: @ "एक्स% d से अधिक होना चाहिए", एक्स]);

NSCAssert साथ

(एक्स> 11, [NSString stringWithFormat: @ "एक्स% d से अधिक होना चाहिए", एक्स]);

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