2012-06-14 7 views
7

एक्सकोड के लिए उपयोग की जा रही एक उपयोगी युक्ति adding breakpoints on exceptions है।objc_exception_throw और [NSException raise] के बीच क्या अंतर है?

मैं सोच रहा था कि हमें दो ब्रेकपॉइंट्स जोड़ने की आवश्यकता क्यों है - एक objc_exception_throw और [NSException raise] के लिए एक।

कोई कवर कौन सा कवर करता है जो दूसरे नहीं करता है?

उत्तर

4

आपको केवल objc_exception_throw पर ब्रेकपॉइंट का उपयोग करना चाहिए। विधि -[NSException raise]objc_exception_throw पर कॉल करती है, इसलिए objc_exception_throw-[NSException raise] कवर सभी मामलों को शामिल करता है। दूसरी तरफ सही नहीं है: @throw निर्देश objc_exception_throw पर सीधे कॉल करने के लिए संकलित किया गया है। जबकि objc_exception_throw पर एक ब्रेकपाइंट काम करेंगे,

- (void)throwAndCatch 
{ 
    @try { 
     NSException *exception = [[NSException alloc] initWithName:@"Test" 
                  reason:@"test" 
                  userInfo:nil]; 
     @throw exception; 
    } 
    @catch (NSException *exception) { 
     NSLog(@"Caught"); 
    } 
} 

जब -throwAndCatch बुला, -[NSException raise] पर एक ब्रेकपाइंट कोई प्रभाव नहीं है: यह विधि अंतर को दर्शाता है।

0

यहाँ से एप्पल के अपवाद के बारे में प्रलेखन क्या है:

@throw और बढ़ाने के बीच एक महत्वपूर्ण अंतर यह है कि बाद के एक NSException वस्तु के लिए एक ही भेजा जा सकता है, जबकि @throw वस्तुओं की अन्य प्रकार ले सकता है इसकी तर्क के रूप में (जैसे स्ट्रिंग ऑब्जेक्ट्स)। कोको अनुप्रयोगों को केवल एनएसईएक्सप्शन ऑब्जेक्ट्स को थ्रो करना चाहिए।

यदि आप एक Cocoa applciation project कार्यान्वित कर रहे हैं इसका मतलब है और यदि आप सख्ती से कि @throw का पालन केवल NSExeption वस्तुओं वे एक ही कर रहे हैं।

संदर्भ: Link

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