मैंने अक्सर आईओएस कोड में "जोर" देखा, मैं इसे Google करता हूं, और यह जानना है कि यह सच या गलत है।रिलीज में एनएसएएसएसर्ट अक्षम होने पर कैसे पता चलेगा?
मैं जानना चाहता हूं कि यह रिलीज मोड में स्वतः अक्षम हो जाएगा या नहीं?
मैंने अक्सर आईओएस कोड में "जोर" देखा, मैं इसे Google करता हूं, और यह जानना है कि यह सच या गलत है।रिलीज में एनएसएएसएसर्ट अक्षम होने पर कैसे पता चलेगा?
मैं जानना चाहता हूं कि यह रिलीज मोड में स्वतः अक्षम हो जाएगा या नहीं?
एनएसएएसएसर्ट() और उसके साथी का उपयोग करें।
प्रोजेक्ट में आपकी रिलीज कॉन्फ़िगरेशन के लिए NS_BLOCK_ASSERTIONS
परिभाषित करें।
एक्सकोड 4 tremplates रिलीज कॉन्फ़िगरेशन में NSAsserts
अक्षम करें। यह
-DNS_BLOCK_ASSERTIONS=1
"रिलीज" के लिए "अन्य सी ध्वज" में जोड़ता है।
प्रलेखन से:
दावे करता है, तो पूर्वप्रक्रमक मैक्रो NS_BLOCK_ASSERTIONS
परिभाषित किया गया है अक्षम हैं।
एनएसएएसएसर्ट मैक्रो इस स्थिति का मूल्यांकन करता है और दावा हैंडलर के सामने के अंत के रूप में कार्य करता है।
प्रत्येक थ्रेड का अपना दावा हैडलर है, जो वर्ग NSAssertionHandler
वर्ग का एक वस्तु है। जब बोला जाता है, तो एक दावा हैडलर एक त्रुटि संदेश मुद्रित करता है जिसमें विधि और वर्ग नाम (या फ़ंक्शन नाम) शामिल होता है। इसके बाद यह NSInternalInconsistencyException
अपवाद उठाता है। यदि स्थिति किसी के मूल्यांकन का मूल्यांकन करती है, तो मैक्रो वर्तमान स्ट्रिंग के लिए दावा हैंडलर पर handleFailureInMethod:object:file:lineNumber:description:
को आमंत्रित करता है, विवरण स्ट्रिंग के रूप में अवरुद्ध करता है।
यह मैक्रो केवल उद्देश्य-सी विधियों के भीतर उपयोग किया जाना चाहिए।
दोनों @CocoaFu और @dasblinkenlight सही हैं:
NDEBUG
परिभाषित होने पर आवेदकों को आपके कोड से सशर्त रूप से संकलित किया जाता है। यदि आप संबंधित बिल्ड सेटिंग्स अनुभाग में NDEBUG=1
परिभाषित करते हैं, तो आप रिलीज़ या डीबग मोड के बावजूद अपने कोड में आवेदकों को निष्क्रिय कर देंगे।
मैं यहाँ एक मेटा-जवाब प्रदान करेगा। NS_BLOCK_ASSERTIONS
NSAssert()
और NDEBUG
बंद कर देता है assert()
बंद करता है। यदि आप दोनों का उपयोग करते हैं तो आपको दोनों की आवश्यकता है।
जैसा कि ज़फ ने कहा -DNS_BLOCK_ASSERTIONS=1
रिलीज के लिए सेट है। हालांकि, अगर आप इसे देखना चाहते हैं।
सबसे पहले उन दस्तावेज़ों में देखें जो NSAssert मैक्रो NS_BLOCK_ASSERTIONS
द्वारा अक्षम है। तो फिर निर्माण करने के लिए इस जोड़ सकते हैं और निरीक्षण यह ठीक अनुपालन करे:
#ifdef NS_BLOCK_ASSERTIONS
#error Error - NS_BLOCK_ASSERTIONS is defined
#endif
फिर योजना जारी करने के लिए (cmd - पाली - <) बदलने
फिर गौर करें कि निर्माण विफल रहता है। इसलिए NS_BLOCK_ASSERTIONS
परिभाषित किया गया है जिसका अर्थ है NSAssert
एस अक्षम हैं।
अब, एक्सकोड 6 के रूप में, सेटिंग ENABLE_NS_ASSERTIONS
है, जो डिफ़ॉल्ट रूप से रिलीज के लिए डीबग कॉन्फ़िगरेशन और 0
के लिए 1
पर सेट है।
आप ENABLE_NS_ASSERTIONS=1
तर्क पारित करके कमांड लाइन पर रिलीज बिल्ड के लिए इसे चुन सकते हैं, जो मैं यूनिट परीक्षण चलाने के लिए कर रहा हूं जो दावा शर्तों की जांच करता है, लेकिन अन्यथा DEBUG
ध्वज बंद कर देना चाहिए।
अद्यतन: सत्यापित यह एक्सकोड 8 में भी काम करता है।
एक्सकोड 7 में, प्रोजेक्ट बिल्ड सेटिंग्स में जाएं और खोज बार में "Assert" खोजें। यह खंड "ऐप्पल एलएलवीएम 7.0 - प्रीप्रोकैसिंग" खंड दिखाता है। "फाउंडेशन एसेरेंस सक्षम करें" नामक एक सेटिंग है।
मैंने वहां से एनएसएएसएसर्ट सफलतापूर्वक सक्षम/अक्षम कर दिया है।
जो ऐप की 'AppName.xcodeproj/project.pbxproj' फ़ाइल में 'ENABLE_NS_ASSERTIONS = NO;' ध्वज जोड़ता है – computingfreak
यहाँ मैं के शीर्ष पर करते हैं मेरी 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
की अपेक्षा करता है।)
यह स्पष्ट रूप से एक पागल डिज़ाइन है जो डिस्प्ले डिफ़ॉल्ट रूप से रिलीज़ में बंद नहीं होता है। मुझे पता है कि हर दूसरे सी संकलक के चेहरे में flies। –
@ सेवाएलेक्सेव सहमत, हमें एक सदमे मिली जब सम्मेलन अभी भी रिलीज में आया था। पूरी तरह से अपरंपरागत। हमारा दर्शन 'विकास में तेजी से असफल रहा है, उत्पादन में कड़ी मेहनत कर रहा है'। –