2012-03-20 21 views
35

गुण:/ बनाए रखने आवंटितमजबूत/कमजोर/बनाए रखने/unsafe_unretained/संपत्ति synthesizing के लिए आवंटित

  • बनाए रखने - यह, को बनाए रखा है पुराने मूल्य जारी की है और उसके असाइन
  • असाइन - यह IOS5 = मजबूत/कमजोर: केवल स्वामित्व के लिए असाइन किया गया है

गुण 0 IOS4 = बनाए रखने/unsafe_unretained

  • मजबूत (iOS4 = बनाए रखने) - स्वामी i'am, तो आप इस उद्देश्य ठीक से पहले उस के साथ dealloc नहीं कर सकते हैं = बनाए रखने

  • कमजोर (iOS4 = unsafe_unretained) - एक ही बात के रूप में असाइन, कोई को कायम रखने में जारी

तो unsafe_unretained == आवंटित?

@property (nonatomic, assign) NSArray * tmp; 

के बराबर है?

@property (nonatomic, unsafe_unretained) NSArray * tmp; 

और इसके विपरीत?

यदि हां, तो आईओएस 4 में कब पसंद किया जाए, या क्यों (unsafe_unretained) असाइन किया गया है?

और आईओएस 4 में एक प्रतिनिधि असुरक्षित या असाइन किया जाना चाहिए?

उत्तर

46

यदि ऐसा है, तो आईओएस 4 में कब पसंद किया जाए, या क्यों (unsafe_unretained) असाइन किया गया है?

आपको unsafe_unretained का उपयोग करना चाहिए। आप अपने कोड के पाठक को दिखाना चाहते हैं कि आप वास्तव में कमजोर उपयोग करना चाहते थे लेकिन यह संभव नहीं था क्योंकि आईओएस संस्करण पर कमजोर उपलब्ध नहीं है जिसे आप तैनात करना चाहते हैं।

एक दिन आप आईओएस 4 के लिए समर्थन छोड़ देंगे। और फिर आप unsafe_unretained खोज सकते हैं और उन सभी को weak से प्रतिस्थापित कर सकते हैं। यह assign के लिए खोज और पता लगाना है, तो आप वास्तव में मतलब assign या weak

unsafe_unretained के उपयोग अधिक पठनीय और समझा जा सकता कोड जहां डेवलपर के इरादों को देखने के लिए आसान कर रहे हैं बनाता है की तुलना में काफी आसान हो जाएगा। मूल रूप से उसी कारण से हम 1 के बजाय YES का उपयोग करते हैं।

+0

इसलिए आईओएस 4 असाइन == unsafe_unretained में, लेकिन आईओएस 5 असाइन करें! = कमजोर, इसलिए unsafe_unretained जहां कमजोर होना चाहिए? दाएं –

+0

और एक प्रतिनिधि को असुरक्षित या असाइन किया जाना चाहिए? –

+14

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

3

कोको और कोको टच में कुछ कक्षाएं हैं जो अभी तक कमजोर संदर्भों का समर्थन नहीं करती हैं, जिसका अर्थ है कि आप उन्हें कम रखने के लिए एक कमजोर संपत्ति या कमजोर स्थानीय चर घोषित नहीं कर सकते हैं। इन कक्षाओं में एनएसटीक्स्टव्यू, एनएसएफओटी और एनएससीओलर स्पेस शामिल हैं; पूरी सूची के लिए, एआरसी रिलीज नोट्स में संक्रमण देखें।

यदि आपको इन कक्षाओं में से किसी एक के लिए कमजोर संदर्भ का उपयोग करने की आवश्यकता है, तो आपको एक असुरक्षित संदर्भ का उपयोग करना होगा।

NSObject * __unsafe_unretained unsafeReference; 

एक असुरक्षित संदर्भ में है कि यह नहीं रखता एक कमजोर संदर्भ के समान है:

@property (unsafe_unretained) NSObject *unsafeProperty; 

चर के लिए, आप __unsafe_unretained उपयोग करने की आवश्यकता: एक संपत्ति के लिए, यह unsafe_unretained विशेषता का उपयोग का मतलब है इसकी संबंधित वस्तु जिंदा है, लेकिन गंतव्य वस्तु को हटा दिया गया है, तो यह शून्य पर सेट नहीं किया जाएगा। इसका मतलब यह है कि आपको मूल रूप से अब अस्वीकृत ऑब्जेक्ट द्वारा कब्जा कर लिया गया स्मृति के लिए एक लटकते सूचक के साथ छोड़ा जाएगा, इसलिए शब्द "असुरक्षित"। एक खतरनाक सूचक को संदेश भेजना परिणामस्वरूप दुर्घटनाग्रस्त हो जाएगा।

सौजन्य: ऐप्पल (https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html)।

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