2010-06-17 18 views
20

सिर्फ एक कोड की समीक्षा कर रहे थे और आश्चर्य करने के लिए शुरू:अगर (स्वयं = [सुपर init]) बनाम अगर ((स्वयं = [सुपर init]))

मैं if (self = [super init]) चेकों [super init] की वापसी मान निर्दिष्ट है कि क्या सोचा परिवर्तनीय self सफल था या नहीं (ऑपरेशन का मूल्य)। इस प्रकार (self = nil) वास्तव में TRUE होगा।

मैं if ((self = [super init])) चेकों क्या असाइनमेंट के बाद self का मूल्य (चर की मूल्य) है सोचा। इस प्रकार ((self = nil))FALSE होगा।

अपनी खुद की कक्षाओं को शुरू करते समय उपयोग करने का सही तरीका कौन सा है? ऐप्पल प्रलेखन पूर्व (for example here) का उपयोग करता है, जो शैली मैं वास्तव में अब उपयोग कर रहा हूं।

उत्तर

18

वे दोनों एक ही काम करते हैं। यह बात है कि if मूल्यांकन इसके अंदर अभिव्यक्ति का मान है, जो असाइनमेंट में असाइन किया गया मान है। तो जब self शून्य नहीं है, तो आप if ब्लॉक में आगे बढ़ते हैं।

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

+0

थेंक्स अभिव्यक्ति को स्पष्ट करने के लिए - और क्यों मैंने सोचा कि अतिरिक्त कोष्ठक होना चाहिए! अब मुझे याद है कि अन्य वातावरण में ऐसी कंपाइलर चेतावनियां मिल रही हैं और दूसरी संश्लेषण जोड़ रही है (अभिव्यक्ति की जांच करने के बाद वास्तव में जो भी मैं चाहता था, वास्तव में किया गया था)। – JOM

4

"असाइनमेंट अभिव्यक्ति के पास असाइनमेंट के बाद बाएं ऑपरेंड का मान होता है" (सी 99), तो किसी भी तरह से वैरिएबल का मान है, जैसा कि आपने इसे रखा है। अतिरिक्त कोष्ठक कोई फर्क नहीं पड़ता (चेतावनी के लिए संभवतः छोड़कर)।

12

जैसा कि अन्य ने कहा है कि इस मामले में कोष्ठक कोई फर्क नहीं पड़ता। जहां वे बात कर रहा है तो आप स्पष्ट रूप से शून्य के खिलाफ जांच:

if (self = [super init] != nil) // wrong! 

if ((self = [super init]) != nil) // right 

= = की तुलना में अधिक पूर्वता है तो पहले मामले में आप की [super init] != nil (शायद सच है) आत्म करने के लिए और उसके बाद के लिए परीक्षण करता है बूलियन परिणाम आवंटित चोर।

व्यक्तिगत रूप से, मुझे कोई परवाह नहीं है लेकिन परीक्षण के बाहर स्पष्ट रूप से असाइनमेंट करना पसंद करते हैं। यह मेरी प्रोग्रामिंग पृष्ठभूमि का एक प्रतिबिंब है जिसने मुझे विश्वास दिलाया है कि बूलियन पूर्णांक और पॉइंटर्स से एक अलग प्रकार हैं और यह कार्य अभिव्यक्ति नहीं है, भले ही सी कार्यान्वयन के मामले में, मैं गलत हूं।

self = [super init]; 
if (self != nil) 
+0

प्राथमिकता के बारे में अच्छी अनुस्मारक! – JOM

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