2011-02-09 7 views
11

एलएलवीएम के साथ एक्सकोड 4 से पहले यह संकलक अनजान हो गया। सशर्त के भीतर असाइनमेंट पूरी तरह से जानबूझकर और कोको मुहावरे है।अगर (स्वयं = [सुपर init]) - एलएलवीएम चेतावनी! आप इसके साथ कैसे काम कर रहे हैं?

चयनित एलएलवीएम कंपाइलर के साथ एक्सकोड 4 शिकायत करने में विफल रहता है, न कि संकलन समय पर, जैसे ही आप इसे पीले चेतावनी आइकन प्रकट करते हैं। चेतावनियों को त्रुटियों के रूप में बंद करना और चेतावनी को अनदेखा करना एक अच्छा विचार नहीं लगता है। कोष्ठक कचरे की जगह से असाइनमेंट को स्थानांतरित करना। हर नई परियोजना के लिए एक चेतावनी के साथ इस चेतावनी को बंद करने के लिए थकाऊ हो जाएगा।

आप इसके साथ कैसे काम कर रहे हैं? नया मुहावरे क्या होगा?

+1

कोड स्वरूपण करते समय, "बर्बाद करने की जगह" वास्तव में एक अपशिष्ट नहीं है। कार्यक्रम संरचना "कचरे की जगह" को प्रतिबिंबित करने के लिए लाइनों को इंडेंट करना लेकिन आप ऐसा नहीं करते हैं? – JeremyP

+0

केवल स्वयं के लिए असाइन/मूल्यांकन के मुहावरे के सापेक्ष बर्बाद जगह। मुझे इस बात की बहुत परवाह है कि कोड कितना घना दिखता है और जब चीजों को स्पष्ट करता है तो अतिरिक्त लाइनों पर ध्यान नहीं दिया जाता है। –

+1

डबल नकारात्मक जेरेमीपी से प्यार करें। –

उत्तर

18

यह वास्तव में एक बहुत पुरानी चेतावनी है, यह जीसीसी के साथ और साथ डिफ़ॉल्ट रूप से सिर्फ बंद किया गया था क्लैंग 1.6। एक्सकोड वास्तव में आपको इसे ठीक करने के लिए एक सुझाव देना चाहिए - अर्थात्, कोष्ठक को दोगुना करना।

if ((self = [super init])) { ... } 

कोष्ठक के अतिरिक्त जोड़ी संकलक कि तुम सच में सशर्त में एक काम करने का इरादा था बताता है।

+0

तो ऐसा करता है - मुझे लगता है कि मुझे पता था कि यह किस बारे में शिकायत कर रहा था इसलिए मैंने टूलटिप नहीं पढ़ा। –

4

बस इसे संकलक है कि आप उद्देश्य पर बताए रहे हैं उससे स्पष्ट करना कोष्ठकों के दो जोड़े का उपयोग करें:

if ((self = [super init])) 
10

आप नए Xcode पाठ मैक्रो से एक init विधि बनाते हैं, तो आपने देखा होगा कि init करने के लिए नई धन्य तरीका है:

- (id)init { 
    self = [super init]; 
    if (self) { 
     <#initializations#> 
    } 
    return self; 
} 

यह चेतावनी से बचा जाता है। हालांकि व्यक्तिगत रूप से मेरे अपने कोड में अगर मैं इस पर आ जाता हूं तो मैं बस केविन दिखाए गए तरीके को लागू कर रहा हूं।

कुछ जानना अच्छा है!

+2

बिल्कुल सही नहीं है कि आप इसे एक नया "धन्य तरीका" कह सकते हैं।ऐप्पल हमेशा कोडिंग शैलियों के बारे में असंगत रहा है। –

+1

मैंने नहीं कहा था कि पिछली शैलियों को एक बार भी आशीर्वाद नहीं दिया गया था ... कंप्यूटिंग में, कोई आशीर्वाद हमेशा के लिए नहीं है। तो शायद यह एक "आकर्षण" से अधिक है। –

+0

केविन और केंडल के दोनों जवाब मान्य हैं। उनके बीच का अंतर यह है कि केंडल के चेक यह देखने के लिए कि सुपरक्लास के प्रारंभिक कार्य ने काम किया है या नहीं। हारून हिलेग्रास ने अपनी पुस्तक में बताया कि सुपरक्लस की शुरुआत विफल होने पर कुछ शुरुआती लोग शून्य वापस आ जाएंगे। मैं धारणा है कि इस तरह के मामले रोग (एक क्रम की विफलता) होगा जिसके कारण वहाँ एक शून्य वापसी की स्थिति में प्रारंभ पुन: प्रयास करने के किसी भी उदाहरण नहीं दिखाई दे रहा है के तहत हूं। मैं यहां अपनी गहराई से बाहर हूं, और केवल उस बिट पर अनुमान लगा रहा हूं। मुझे गहराई से स्पष्टीकरण में एक आधिकारिक देखना पसंद है। –

3

प्रोजेक्ट नेविगेटर लाएं और अपनी परियोजना का चयन करें। दिखाई देने वाली मुख्य विंडो में, "सभी" चुनें। "एलएलवीएम कंपाइलर 2.0 - चेतावनी" खंड के तहत, "अन्य चेतावनी झंडे" चुनें। "डीबग" और "रिलीज" दोनों के लिए ध्वज "Wno-idiomatic-parentheses" ध्वज जोड़ें। अब साफ और पुन: संकलित करें। enter image description here

0

कुछ अन्य लोगों ने सुझाव दिया है कि आपको कोष्ठक का एक अतिरिक्त सेट जोड़ना चाहिए।

Replace: if\s*\({1}\s*self\s*={1}(.*)\){1} 
With: if ((self =\1)) 

सावधान क्योंकि यह भी है, तो मिलेगा रहें:

मैं रेगुलर एक्सप्रेशन गुरु से दूर कर रहा हूँ तो यह साफ करने के लिए स्वतंत्र लग रहा है, लेकिन यह खोजने के लिए और Xcode में की जगह मेरी उदाहरणों में से लगभग 95% तय (self == ...), तो पूर्वावलोकन का उपयोग करें और उनको अनचेक करें या मेरे regex को ठीक करें :)

और स्वयं = ... का उपयोग शुरू करें; अगर (स्वयं), यह क्लीनर है।

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