2012-07-09 10 views
8

मैं Square Cam in Apple's sample code के लिए नमूना कोड के कुछ देख रहा हूं। मैं एआरसी का उपयोग कर एक आधुनिक परियोजना में इसकी कुछ कार्यक्षमताओं को दोहराना चाहता हूं।एआरसी के साथ 'आवश्यकता (..., जमानत)' कथन कैसे संभालें?

BOOL success = (destination != NULL); 
require(success, bail); 

कौन सा संकलक त्रुटि उत्पन्न:: - क्या का उपयोग कर एक परियोजना में इस तरह के बयानों को संभालने के लिए उपयुक्त तरीका है

Goto into protected scope.

मेरा प्रश्न है हालांकि, वहाँ की एक टन जैसे बयानों की आवश्यकता होती है कर रहे हैं एआरसी?

+0

एक और नोट - मैं बस नियंत्रक एआरसी का उपयोग करने के लिए नहीं फ़्लैगिंग लेकिन इस फाइल में काम मुश्किल होगा के रूप में आदर्श नहीं होगा के बारे में सोचा। एआरसी का उपयोग न करने के लिए तीसरे पक्ष के पुस्तकालयों को ध्वजांकित करना ठीक है, लेकिन यदि यह परियोजना कार्यान्वयन का हिस्सा है तो यह एक खराब वर्कफ़्लो बनाएगा क्योंकि एक्सकोड अभी भी फाइल खोलने के दौरान कंपाइलर त्रुटियों/चेतावनियों को उत्पन्न करता है। दिए गए नियंत्रक के लिए स्रोत कोड में काम करते समय वास्तविक चेतावनियां या त्रुटियां देखना असंभव होगा। –

+0

मुझे ऐसी कोई त्रुटि नहीं मिलती है। आपकी "जमानत" रेखा कहां है? या आप नमूना कोड का उपयोग कर रहे हैं? – borrrden

+0

क्या कोई कारण है कि लोग मेरे प्रश्न का मतदान क्यों कर रहे हैं? –

उत्तर

10

मुझे एक ही समस्या थी (उसी नमूना कोड के साथ)। कोड इस तरह देखा:

BOOL success = (destination != NULL); 
require(success, bail); 

//Initialise some variables 

bail: 
//Deal with errors 

मैं स्पष्ट उनके कार्यक्षेत्र बनाने के लिए घोषणाओं के साथ ब्लॉक के चारों ओर ब्रेसिज़ कहा:

BOOL success = (destination != NULL); 
require(success, bail); 
{ 
    // *** Initialise some variables *** 
} 
bail: 
{ 
    //Deal with errors 
} 

और यह मेरे लिए समस्या हल हो। इसे देखकर मैंने यह भी सीखा कि आप कभी-कभी अधिक विस्तार प्राप्त करने के लिए बिल्ड त्रुटियों का विस्तार कर सकते हैं।

+0

अच्छा जवाब +1। दायरे को परिभाषित करने के लिए बस ब्रेसिज़ जोड़ना एक अच्छा समाधान है। अधिकांश उत्तरों का कहना है कि गेटो के नीचे घोषित न करें, लेकिन कोई उचित ब्रेसिज़ के साथ कर सकता है। – braden

3

जाहिर है bail एक या अधिक __block चर के साथ एक दायरे में है; इसकी अनुमति नहीं है। अधिक के लिए http://clang.llvm.org/compatibility.html#blocks-in-protected-scope देखें। प्रस्तावित समाधान __block परिवर्तनीय के दायरे को सीमित करने के लिए है, उन्हें ब्रेस-डिलीमिट किए गए ब्लॉक में डालकर। यह हमेशा काम नहीं कर सकता है; YMMV।

0

मैं @ लुईस 42 उत्तर के लिए कुछ विवरण जोड़ रहा हूं।

यदि आप अपने दायरे में परिवर्तनीय नहीं डालते हैं, तो आप गेटो के बाद सभी चर के प्रारंभिकरण को बाईपास करते हैं, और जब एआरसी इसे साफ़ करने का प्रयास करता है, तो यह कुछ यादृच्छिक बिट स्मृति को रिलीज़ करने की कोशिश कर देगा।

यदि आप अपने दायरे में चर डालना नहीं चाहते हैं तो सुनिश्चित करें कि किसी भी चर को गोटो कीवर्ड के नीचे घोषित नहीं किया जाना चाहिए।

Jumps to within __block variable scope

__block require special runtime initialization. A jump into the scope of a __block variable bypasses this initialization, leaving the variable's metadata in an invalid state.

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