2012-02-03 9 views
12

मैं ग्रहण के रूप में, इस एआरसी के तहत के ठीक से कार्य करेंगे अपरिवर्तनीय वस्तु के लिए:ऑब्जेक्टिव-सी अपरिवर्तनीय वस्तु copyWithZone: एआरसी-संगत प्राप्ति

- (id) copyWithZone:(NSZone *)zone { 
    return self; 
} 

लेकिन अगर मैं गहरी प्रति की जरूरत है, मैं कुछ इस तरह लिखना चाहिए:

- (id) copyWithZone:(NSZone *)zone { 
    Immutable *copy = [[Immutable alloc] initWithStr:str]; 
    return copy; 
} 

तो, अगर मुझे सही लगता है, तो एआरसी स्थिति (1) और (2) को समझ लेगा और संदर्भों के लिए "+1" के बारे में सही निर्णय लेगा।

क्या मैं सही हूँ?

+0

मुझे लगता है कि एआरसी मूल रूप से प्रत्येक लौटने वाली वस्तुओं का इलाज 'आवंट ~' और 'प्रति ~' के अपवादों के साथ स्वत: समाप्त हो जाती है। मैं एआरसी के तहत सभी लौटने वाली वस्तुओं का इलाज करता हूं, केवल '-रेरेन' और '-autorelease'd अर्थात् हैं। और बस आवंटन के लिए एक और '-retain' जोड़ता है और मामलों की प्रतिलिपि बनाता है। नतीजतन, एक बरकरार रखता है और एक autorelease समाप्त हो सकता है, और केवल एक बनाए रखा जाएगा ... – Eonil

उत्तर

12

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

- (id) copyWithZone:(NSZone *)zone { 
    return [self retain]; 
} 

यह है कि मैं क्या माइग्रेशन के बाद मिल गया है:

- (id) copyWithZone:(NSZone *)zone { 
    return self; 
} 

यह एक जादू कैसे एआरसी कभी कभी काम करता है, लेकिन लगता है कि हम इसे यह काम अच्छी तरह से है कर रही होगी मानना ​​है कि सिर्फ चाहिए। :-)

+1

एक प्रति एक अलग वस्तु (एक अलग सूचक) वापस करना चाहिए। तो आपका समाधान समस्याएं पैदा कर सकता है ... – Macmade

+8

@ मैकमेड यदि ऑब्जेक्ट अपरिवर्तनीय है, तो उसी ऑब्जेक्ट में एक बनाए गए पॉइंटर को वापस करना स्वीकार्य है। एनएसएसटींग, एनएसडीएटी, आदि यह सब करते हैं। –

+0

निश्चित रूप से, यह स्वीकार्य है। लेकिन इसके बारे में जागरूक होना महत्वपूर्ण है, खासकर यदि आप कुछ कार्यों के लिए सूचक तुलना से निपटते हैं। :) – Macmade

4

स्वचालित संदर्भ गणना, as stated in the specification, मानक कोको नामकरण प्रथाओं का पालन करता है। इसका अर्थ है कि उपसर्ग init, copy, और new के साथ विधियों को ऑब्जेक्ट्स लौटने के लिए माना जाता है जिन्हें कॉलर का मालिक है (+1 संदर्भ संख्या)। इसलिए, यदि आप किसी ऑब्जेक्ट में से किसी एक ऑब्जेक्ट को वापस करते हैं, तो एआरसी स्वचालित रूप से इसे इस तरह से संभालता है क्योंकि अब आप इसे स्पष्ट रूप से बनाए रख सकते हैं।

ऐप्पल ने इंगित किया है कि इसके आसपास एक समस्याग्रस्त मामला मैन्युअल रूप से संदर्भित गिनती कोड का उपयोग करके एक तृतीय पक्ष ढांचा होगा जहां लेखकों ने मानक नामकरण सम्मेलनों का पालन नहीं किया था। उनके द्वारा दिया गया एक उदाहरण एक ऑटोरेलेज्ड स्ट्रिंग को वापस करने का तरीका था जिसे copyRightString कहा जाता है। यह एआरसी पर अतिरंजित हो जाएगा, क्योंकि यह मान लेगा कि +1 संदर्भ संख्या वाली वस्तु ऐसी विधि से वापस आती है।

आपको निम्न रूप संशोधक का उपयोग करने के लिए एक विशेष तरीके से इस विधि के इलाज के लिए एआरसी के लिए मजबूर कर सकते हैं:

-(NSString*) copyRightString NS_RETURNS_NON_RETAINED; 

Mugunth कुमार his ARC migration writeup में इस पर थोड़ा और विस्तार है।

+0

यह '+ alloc',' + copy', और '+ new' है। '-init' ऑब्जेक्ट की बनाए रखने की गिनती को नहीं बदलता है। –

+0

@ जोनाथनग्रिन्सन - ठीक है, लेकिन वे '-init' उपसर्ग की तलाश में दिखाई देते हैं। उपर्युक्त लिंक्ड विनिर्देश से: "सबसे आम परिदृश्य इन मॉडलों को init, alloc, new, और प्रतिलिपि तरीकों से बनाए रखा रिटर्न है, लेकिन ढांचे में अन्य मामले हैं।"यह' -alloc' के संयोजन में होने की संभावना है, लेकिन मैंने अतीत में स्थैतिक विश्लेषक को कुछ हद तक '-init'' के साथ पूर्ववत किया है। –

+0

'-init' एक ऑब्जेक्ट देता है जिसे रिलीज़ किया जाना चाहिए क्योंकि इसे केवल 'ऑलोक' के तुरंत बाद बुलाया जाता है। वास्तविक रखरखाव (पेपर पर) '+ alloc' में किया जाता है, '-init' बस" आगे "। –

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