6

मुझे एक ऐप मिला है (केवल ios5) कि एक विधि के अंदर एक ब्लॉक के अंदर एक कमजोर चर घोषित करता है जो एक उदाहरण के संदर्भ में उपयोग करता है एक दृश्य नियंत्रक।उद्देश्य-सी एआरसी __weak परिवर्तनीय संदर्भ चेतावनी चेतावनी देता है "__weak विशेषता को स्वचालित चर पर निर्दिष्ट नहीं किया जा सकता है"

__weak विशेषता एक स्वत: चर

कि आवेदन में पर निर्दिष्ट नहीं किया जा सकता है मैं एक बहुत कमजोर संदर्भ का उपयोग किया है:

QRCodeViewController * __weak weakSelf = self; 
समस्या

कि संकलक कह एक चेतावनी से पता चलता है और मैंने कभी ऐसा चेतावनी नहीं देखी, अन्य वर्गों का एकमात्र अंतर यह है कि यह वर्ग एक .mm फ़ाइल में कार्यान्वित किया गया है क्योंकि यह एक सी ++ ऑब्जेक्ट का उपयोग करता है और अगर मैं इसे एमएम के रूप में छोड़ देता हूं तो संकलित नहीं हो सकता है।
मुझे कहना होगा कि कोड ठीक काम करता प्रतीत होता है।
कोई सुझाव?

+0

यह '__weak QRCodeViewController * weakSelf = स्वयं नहीं करना चाहिए;'? –

+2

@ मार्टिन या तो एक काम करता है, वे बराबर हैं, आपका तरीका वह है जिसे मैं अक्सर इस्तेमाल करता हूं, लेकिन एंड्रिया का तरीका ऐप्पल द्वारा अनुशंसित किया जाता है। –

+0

इसी तरह के प्रश्न: http://stackoverflow.com/questions/10431110/nested-blocks-and-references-toselfself। जवाब था कि तैनाती लक्ष्य 4.0 पर सेट किया गया था, लेकिन यह आपके लिए मामला नहीं है। सही बात? –

उत्तर

4

यह एक ही चेतावनी सामना करते हुए, मैं इसे एक __block का उपयोग कर गायब करने के निम्नलिखित तरीके का श्रेय:

__block __weak MyViewController* weakSelf = self; 
+0

अच्छा यह काम करता है !!!! – Andrea

0

मुझे यकीन नहीं है कि चेतावनी क्यों कहती है कि __weak निर्दिष्ट नहीं किया जा सकता है। AFAIK इसे निर्दिष्ट करना संभव होना चाहिए, भले ही स्वचालित चर के लिए __weak का उपयोग करना बहुत खतरनाक हो।

ऐप्पल दस्तावेज कहता है कि यदि आप करते हैं तो संकलक एक चेतावनी प्रदान करेगा, लेकिन वास्तविक चेतावनी पाठ का अर्थ यह है कि विशेषता को अनदेखा किया जा रहा है न केवल इसका उपयोग करना खतरनाक है, जबकि दस्तावेज़ीकरण का अर्थ यह है कि यह है खतरनाक लेकिन यह उम्मीद के अनुसार काम करता है (यदि आप वास्तव में समझते हैं कि क्या उम्मीद करनी है)।

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

+0

हाय एनालॉग फ़ाइल, आपके उत्तर के लिए धन्यवाद, तथ्य यह है कि उन वस्तुओं के लिए कमजोर संदर्भ बनाने के लिए सामान्य है जो आप चक्र को बनाए रखने से बचने के लिए ब्लॉक में पास करना चाहते हैं। मैंने बिना किसी चेतावनी के मेरे कोड में कई बार किया। मैं मानता हूं कि एक स्वचालित चर के लिए कमजोर खतरनाक है, या बेहतर एक गैर-अर्थ है, क्योंकि जब आप एसिंक प्रक्रिया के लिए ब्लॉक में उपयोग करेंगे तो वेरिएबल चला गया है क्योंकि इसका कोई मजबूत संदर्भ नहीं है। लेकिन यहां मैं स्वयं को असाइन कर रहा हूं जो एक स्वचालित चर नहीं है और यह वर्ग के अस्तित्व से भी मजबूत संदर्भित है। – Andrea

+0

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

+1

@AnalogFile: क्या आपके पास ऐप्पल प्रलेखन का संदर्भ है जहां यह कहा जाता है कि यदि __weak स्वचालित चर के साथ उपयोग किया जाता है तो संकलक चेतावनी उत्सर्जित करता है? धन्यवाद! –