2010-01-06 16 views
5

मैं अपने आईफोन ऐप में NSAssert का उपयोग करने की कोशिश कर रहा हूं ताकि अगर एक अप्रत्याशित स्थिति होती है, तो एप्लिकेशन क्रैश लॉग में एक सार्थक संदेश के साथ तेज़ी से और क्रैश हो जाता है।धागे में एनएसएएसएसर्ट उपयोग

यह ठीक काम करता है अगर विफल NSAssert मुख्य धागे पर है, क्योंकि यह डिफ़ॉल्ट रूप से NSInternalInconsistencyException बढ़ाता है जो निष्पादित नहीं होता है और निष्पादन रोकता है। लेकिन मैं पृष्ठभूमि धागे में भी प्रोसेसिंग कर रहा हूं, इस मामले में NSAssert बस थ्रेड को रोकता है, लेकिन प्रोग्रामिंग चलती रहती है।

- (void)main { 
    @try { 
     int x = 14; 
     ... 
     NSAssert1(x > 20, @"x should be greater than 20, was %d", x); 
     ... 
    } 
    @catch (NSException *e) { 
     [e performSelectorOnMainThread:@selector(raise) withObject:nil waitUntilDone:YES]; 
    } 
} 

वहाँ एक बेहतर तरीका है:

मेरे वर्तमान समाधान को पकड़ने और मुख्य थ्रेड में अपवाद rethrow को (इस मामले में, NSOperation के main विधि) है? शायद एक कस्टम एनएसएएसएसरशन हैंडलर का उपयोग कर?

मैं जानता हूँ कि मैं सिर्फ सी assert इस्तेमाल कर सकते हैं एक स्थिर टिप्पणी के साथ:

assert(x > 20 && "x should be greater than 20"); 

लेकिन यह मुझे दिखाने के लिए क्या x की वास्तविक ऐसा न करने पर मूल्य है अनुमति नहीं है।

+0

मुझे एक ही समस्या है, लेकिन प्रस्तावित समाधान मेरे लिए काम नहीं करेगा। एनएसएएसएसर्ट ट्रिगर किया जा रहा है, धागा मर जाता है, लेकिन ऐप चल रहा है। मैं कोकोस 2 डी इंजन का उपयोग कर रहा हूं। क्या कोई और अधिक समाधान प्रदान कर सकता है? –

उत्तर

1

आप एक परीक्षण कोड के साथ NSAssert को एक अपवाद उठाकर बदल सकते हैं। इस तरह, यदि दावा विफल हुआ, तो एक अपवाद फेंक दिया जाएगा, @catch ब्लॉक द्वारा पकड़ा गया और मुख्य धागे पर फिर से उठाया गया।

नोट: कॉम्पैक्ट फ़ॉर्म प्रदान करने के लिए आप सी सी मैक्रो को भी परिभाषित कर सकते हैं।

+0

यह वही है जो एनएसएएसएसर्ट डिफ़ॉल्ट रूप से करता है - यह एक एनएसआईएननल इन्फॉन्सिस्टेंसी अपवाद उठाता है। तो आप उपरोक्त पकड़/पुनः उठाने के समाधान की वकालत कर रहे हैं? – sickp

+0

मैंने प्रलेखन को फिर से पढ़ा है और एनएसएएसएसर्ट अपवाद बढ़ाता है। तो आपका वर्तमान समाधान सही लगता है। –