उत्तर

32

__strong का अर्थ है कि असाइनमेंट पर, अभिव्यक्ति का रावल बरकरार रखा जाएगा और आदिम अर्थशास्त्र का उपयोग करके अंतराल में संग्रहीत किया जाएगा। (जैसे एक वस्तु पुनःआवंटन करने के लिए, तुम सब करना होगा यह nil आवंटित है, पहले से संदर्भित वस्तु जारी किया जाएगा, nil रख लिया जाएगा, जो प्रभावी रूप से कुछ नहीं करता है और यह आड़ू और क्रीम है।)

__unsafe_unretained और __weak में समान हैं अर्थ यह है कि रावल्यू का पता लालू को सौंपा जाएगा, लेकिन यदि आप __weak क्वालीफायर का उपयोग करते हैं, तो यह ऑपरेशन परमाणु होने की गारंटी है और कुछ अलग-अलग अर्थशास्त्रों के अधीन है। इनमें से एक यह है कि यदि ऑब्जेक्ट को असाइन किया जा रहा है, तो वर्तमान में विलोपन से गुजर रहा है, तो असाइनमेंट nil का मूल्यांकन करेगा और फिर उसे परमाणु रूप से अभिव्यक्ति के अंतराल में संग्रहीत किया जाएगा। इसलिए __unsafe_unretained शब्द, क्योंकि वह ऑपरेशन वास्तव में असुरक्षित और अप्रत्याशित है।

__autoreleasing__strong की तरह है, सिवाय इसके कि यह एक चेतावनी है: बनाए रखा वस्तु वर्तमान autorelease पूल पर धकेल दिया जाता है, तो आप उदाहरण के लिए एक वस्तु का अस्थायी स्वामित्व प्राप्त कर सकते हैं एक संकलन से निकालना और फिर इसे वापस लौटने के लिए फोन करने वाले के लिए । इसके लिए अन्य उपयोग भी हैं, लेकिन उन्हें ज्यादातर किसी वस्तु के अस्थायी स्वामित्व प्राप्त करने के साथ करना होता है।

ये व्यवहार स्वयं को इसी संपत्ति संशोधक (strong, unsafe_unretained और weak) में प्रस्तुत करते हैं।

देखें Clang Automatic Reference Counting Technical Specification

संपादित करें: उन नहीं लक्षित कर iOS 5 और इसलिए कमजोर संदर्भ जो आप के बजाय का उपयोग कर सकते शून्यीकरण पर __weak, Mike Ash wrote a superb article (और कार्यान्वयन) का लाभ मिलता रहा करने में असमर्थ है।

+0

आप 'unsafe__unretain' ऑब्जेक्ट को सुरक्षित कैसे बनाते हैं? मेरा मतलब है, अगर यह संकलक द्वारा स्वचालित रूप से 'शून्य' पर नहीं बदला जाता है तो हमें उस खतरनाक वस्तु को कैसे संभालना चाहिए? –

+0

@ मोहम्मद अब्दुरराफय आप उस मामले में '__weak' का उपयोग कर सकते हैं ... –

+0

यदि मैं गलत नहीं हूं' __weak' बाद के आईओएस संस्करणों में उपलब्ध नहीं है, तो उस स्थिति में मैं 'unsafe__unretain' ऑब्जेक्ट को सुरक्षित कैसे बनाऊंगा, जो स्वचालित रूप से 'शून्य' पर सेट नहीं है? –

4

स्ट्रॉन्ग संपत्ति को बनाए रखने के लिए एआरसी को बताता है।

@property (strong,nonatomic) NSObject *object; 
@property (retain,nonatomic) NSObject *object; 

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

@property (weak,nonatomic) NSObject *object; 
@property (assign,nonatomic) NSObject *object; 

कमजोर केवल आईओएस 4.3 और ऊपर उपलब्ध है। यदि आप आईओएस 4.2 को लक्षित करना चाहते हैं तो आपको unsafe_unretained का उपयोग करने की आवश्यकता है, जो कि असाइन किए गए असाइनमेंट की तरह काम करेगा।

+0

मैक ओएस एक्स पर, 'कमजोर' शेर के बाद ही उपलब्ध है; आपकी आईओएस 4.2 सलाह हिम तेंदुए के लिए भी जाती है। –

+0

@NJones, मेरे पास एक सवाल है हालांकि। धरती पर 'कमजोर' कैसे हो सकता है 'nonatomic'? परिभाषा के अनुसार * कमजोर * * 'परमाणु है। –

+0

@JacobRelkin। यह एक अच्छा सवाल है। मुझे लगता है कि कमजोर संशोधक द्वारा nonatomic belied है।लेकिन इस तरह यह किया गया है; बस जांचने के लिए मैंने एक नया एक्सकोड प्रोजेक्ट शुरू किया, एक लेबल जोड़ा, और उसके बाद एक आउटलेट को पर्याप्त रूप से कनेक्ट किया, यह मुझे पर्याप्त रूप से '@property (कमजोर, nonatomic) IBOutlet UILabel * लेबल;' दिया। – NJones

1

प्रकार क्वालीफायर __autoreleasing, __strong, __unsafe_unretained, और __weak हैं। संपत्ति संशोधक strong, unsafe_unretained, और weak हैं।

एलएलवीएम/क्लैंग दस्तावेज़ में section 4 of Automatic Reference Counting पर एक नज़र डालें।

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