2011-12-18 14 views
34

मैंने अक्सर आईओएस कोड में "जोर" देखा, मैं इसे Google करता हूं, और यह जानना है कि यह सच या गलत है।रिलीज में एनएसएएसएसर्ट अक्षम होने पर कैसे पता चलेगा?

मैं जानना चाहता हूं कि यह रिलीज मोड में स्वतः अक्षम हो जाएगा या नहीं?

+2

यह स्पष्ट रूप से एक पागल डिज़ाइन है जो डिस्प्ले डिफ़ॉल्ट रूप से रिलीज़ में बंद नहीं होता है। मुझे पता है कि हर दूसरे सी संकलक के चेहरे में flies। –

+0

@ सेवाएलेक्सेव सहमत, हमें एक सदमे मिली जब सम्मेलन अभी भी रिलीज में आया था। पूरी तरह से अपरंपरागत। हमारा दर्शन 'विकास में तेजी से असफल रहा है, उत्पादन में कड़ी मेहनत कर रहा है'। –

उत्तर

38

एनएसएएसएसर्ट() और उसके साथी का उपयोग करें।

प्रोजेक्ट में आपकी रिलीज कॉन्फ़िगरेशन के लिए NS_BLOCK_ASSERTIONS परिभाषित करें।

एक्सकोड 4 tremplates रिलीज कॉन्फ़िगरेशन में NSAsserts अक्षम करें। यह

-DNS_BLOCK_ASSERTIONS=1 

"रिलीज" के लिए "अन्य सी ध्वज" में जोड़ता है।

प्रलेखन से:

दावे करता है, तो पूर्वप्रक्रमक मैक्रो NS_BLOCK_ASSERTIONS परिभाषित किया गया है अक्षम हैं।

एनएसएएसएसर्ट मैक्रो इस स्थिति का मूल्यांकन करता है और दावा हैंडलर के सामने के अंत के रूप में कार्य करता है।

प्रत्येक थ्रेड का अपना दावा हैडलर है, जो वर्ग NSAssertionHandler वर्ग का एक वस्तु है। जब बोला जाता है, तो एक दावा हैडलर एक त्रुटि संदेश मुद्रित करता है जिसमें विधि और वर्ग नाम (या फ़ंक्शन नाम) शामिल होता है। इसके बाद यह NSInternalInconsistencyException अपवाद उठाता है। यदि स्थिति किसी के मूल्यांकन का मूल्यांकन करती है, तो मैक्रो वर्तमान स्ट्रिंग के लिए दावा हैंडलर पर handleFailureInMethod:object:file:lineNumber:description: को आमंत्रित करता है, विवरण स्ट्रिंग के रूप में अवरुद्ध करता है।

यह मैक्रो केवल उद्देश्य-सी विधियों के भीतर उपयोग किया जाना चाहिए।

दोनों @CocoaFu और @dasblinkenlight सही हैं:

4

NDEBUG परिभाषित होने पर आवेदकों को आपके कोड से सशर्त रूप से संकलित किया जाता है। यदि आप संबंधित बिल्ड सेटिंग्स अनुभाग में NDEBUG=1 परिभाषित करते हैं, तो आप रिलीज़ या डीबग मोड के बावजूद अपने कोड में आवेदकों को निष्क्रिय कर देंगे।

24

मैं यहाँ एक मेटा-जवाब प्रदान करेगा। NS_BLOCK_ASSERTIONSNSAssert() और NDEBUG बंद कर देता है assert() बंद करता है। यदि आप दोनों का उपयोग करते हैं तो आपको दोनों की आवश्यकता है।

+0

@Rob द्वारा आईओएस 5 प्रोग्रामिंग पढ़ना: इसे प्राप्त करें, इसे पढ़ें, आईओएस 5 में बेहतर प्रोग्राम। – zaph

+0

दुर्भाग्यवश, दो शब्दों के सारांश में आपने गलत तरीके से लिखा है। – Ant

+1

नोट किया गया और तय किया गया। एनएसडीईबीयूजी-> एनडीईबीयूजी –

7

जैसा कि ज़फ ने कहा -DNS_BLOCK_ASSERTIONS=1 रिलीज के लिए सेट है। हालांकि, अगर आप इसे देखना चाहते हैं।

सबसे पहले उन दस्तावेज़ों में देखें जो NSAssert मैक्रो NS_BLOCK_ASSERTIONS द्वारा अक्षम है। तो फिर निर्माण करने के लिए इस जोड़ सकते हैं और निरीक्षण यह ठीक अनुपालन करे:

#ifdef NS_BLOCK_ASSERTIONS 
#error Error - NS_BLOCK_ASSERTIONS is defined 
#endif 

फिर योजना जारी करने के लिए (cmd - पाली - <) बदलने

enter image description here

फिर गौर करें कि निर्माण विफल रहता है। इसलिए NS_BLOCK_ASSERTIONS परिभाषित किया गया है जिसका अर्थ है NSAssert एस अक्षम हैं।

0

अब, एक्सकोड 6 के रूप में, सेटिंग ENABLE_NS_ASSERTIONS है, जो डिफ़ॉल्ट रूप से रिलीज के लिए डीबग कॉन्फ़िगरेशन और 0 के लिए 1 पर सेट है।

आप ENABLE_NS_ASSERTIONS=1 तर्क पारित करके कमांड लाइन पर रिलीज बिल्ड के लिए इसे चुन सकते हैं, जो मैं यूनिट परीक्षण चलाने के लिए कर रहा हूं जो दावा शर्तों की जांच करता है, लेकिन अन्यथा DEBUG ध्वज बंद कर देना चाहिए।

26

अद्यतन: सत्यापित यह एक्सकोड 8 में भी काम करता है।

एक्सकोड 7 में, प्रोजेक्ट बिल्ड सेटिंग्स में जाएं और खोज बार में "Assert" खोजें। यह खंड "ऐप्पल एलएलवीएम 7.0 - प्रीप्रोकैसिंग" खंड दिखाता है। "फाउंडेशन एसेरेंस सक्षम करें" नामक एक सेटिंग है।

मैंने वहां से एनएसएएसएसर्ट सफलतापूर्वक सक्षम/अक्षम कर दिया है।

enter image description here

+2

जो ऐप की 'AppName.xcodeproj/project.pbxproj' फ़ाइल में 'ENABLE_NS_ASSERTIONS = NO;' ध्वज जोड़ता है – computingfreak

0

यहाँ मैं के शीर्ष पर करते हैं मेरी main():

#if defined(NDEBUG) 
{ 
    // The assertion code below should be compiled out of existence in a release 
    // build. Log an error and abort the program if it is not. 
    bool ok = true; 
    NSCAssert(ok = false, @"NS assertions should be disabled but are not"); 
    if (!ok) 
    { 
    NSLog(@"Detected release build but NS_BLOCK_ASSERTIONS is not defined"); 
    return -1; 
    } 
} 
#endif 

ध्यान दें कि जब से main() एक सी समारोह और नहीं एक ऑब्जेक्टिव-सी समारोह है, NSCAssert ऊपर बल्कि NSAssert से प्रयोग किया जाता है । (NSAssert मान्य होने के लिए self की अपेक्षा करता है।)

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