2013-04-22 6 views
7

क्या एआरसीक्या एआरसी

मैं copy (कीवर्ड) को खोजने में कीवर्ड copy की भूमिका है में "कॉपी" की भूमिका है एआरसी में इस्तेमाल किया जा सकता है, जबकि retain और release नहीं किया जा सकता। एआरसी में copy की भूमिका एमआरसी में copy की भूमिका के समान है? यदि हां, तो copy एआरसी में retainCount +1 बनाते हैं?

और मैं Arche के बारे में माइक राख ब्लॉग देखा है ने कहा:

आप की जरूरत स्पष्ट रूप से ब्लॉक के लिए उसकी पहचान पैरामीटर के रूप में पारित कॉपी करने के लिए:

[myArray addObject: [^{ DoSomethingMagical(); } copy]]; 

लेकिन जब मैं इस तरह कोड का परीक्षण (copy का उपयोग किए बिना) यह भी अच्छी तरह से काम करता है।

NSArray *array = [[NSArray alloc] initWithObjects:^{NSLog(@"hahaha");}, nil]; 

[self test:[array objectAtIndex:0]]; 

- (void)test:(void (^)(void))completion 
{ 
       completion(); 
} 

यह मतलब यह है वहाँ copy ब्लॉक करने के लिए कोई जरूरत नहीं है कि जब यह एक id प्रकार के रूप में प्रयोग किया जाता है?

+1

एमआरसी या एआरसी में प्रति का उपयोग करके बनाए रखने की गणना में वृद्धि नहीं होती है। – Rakesh

+3

@ राकेश कहने के लिए अधिक सटीक "एआरसी/एमआरआर में रखरखाव गिनती * हो सकती है" क्योंकि यह एक कार्यान्वयन विस्तार है। NSMutableString के लिए? आपको एक प्रति प्राप्त होती है। एनएसएसटींग के लिए? एक करके गिनती को रोकता है और एक ही वस्तु देता है। – bbum

+0

ध्यान दें कि आपके उदाहरण में ब्लॉक एक स्थिर ब्लॉक की संभावना है और इस प्रकार, आपका कोड केवल संयोग से "काम कर रहा" हो सकता है। – bbum

उत्तर

5

हाँ, एआरसी में copy की भूमिका एमआरआर

copy में copy की भूमिका copyWithZone: विधि लागू करेगा के समान है। जब यह म्यूटेबल ऑब्जेक्ट को भेजता है, तो यह एक क्लोन अपरिवर्तनीय ऑब्जेक्ट लौटाएगा, जो बनाए रखता है। गणना 1 है। जब यह अपरिवर्तनीय वस्तु को भेजती है, तो यह प्रतिलिपि नहीं लेती है, यह ऑब्जेक्ट को वापस कर देगी, लेकिन retainCount +1।

तो जब आप एआरसी में प्रति का उपयोग, तो आप इस तरह उपयोग कर सकते हैं: object1 = [object2 copy]; एआरसी object1, जब तत्कालीन object1 एआरसी द्वारा जारी की है की retainCount का प्रबंधन करेगा, object2 के retainCount एक इसी बदलाव किया जाएगा। तो आप स्मृति के बारे में चिंता मत करो।

block के बारे में id पैरामीटर के रूप में पास होने की आवश्यकता है।

apple document ने कहा:

आमतौर पर, आप कॉपी करने के लिए (या बनाए रखने के) एक ब्लॉक की जरूरत नहीं होनी चाहिए। आप केवल को प्रतिलिपि बनाने की आवश्यकता है जब आप के बाद ब्लॉक का उपयोग करने की अपेक्षा करते हैं जिसमें इसे घोषित किया गया था। प्रतिलिपि बनाई जा रही ढेर

करने और ughoavgfhw said के रूप में एक ब्लॉक ले जाता है:

ब्लाकों स्मृति प्रबंधन के लिए अन्य वस्तुओं के समान हैं, लेकिन ही नहीं। जब एक ब्लॉक जो स्थानीय चर का उपयोग करता है, तो यह स्टैक पर बनाया गया है। इसका अर्थ यह है कि यह केवल तब तक वैध है जब तक कि गुंजाइश मौजूद है। बाद में इस ब्लॉक को सहेजने के लिए, आपको इसे कॉपी करना होगा, इसे ढेर

1

जब आप एआरसी में copy उपयोग करें, यह, एआरसी के बिना के रूप में ही होता है यानी यह उद्देश्य यह है कि प्रति (यह स्मृति में एक नई वस्तु उदाहरण बनाता है) प्राप्त कर रहा है एक कॉपी बन जाती है, और करने के लिए एक strong संबंध बनाता है ऑब्जेक्ट जो कोड निष्पादित करता है।
इसका मतलब है कि ऑब्जेक्ट की प्रति अब 1 की गिनती है, लेकिन यह आपके लिए एआरसी में कोई प्रासंगिकता नहीं है, क्योंकि यह स्वचालित रूप से संभाला जाता है।

4

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

NSMutableArray* objA = [NSMutableArray new]; 
NSMutableArray* objB = objA; 
/* adding an object to either will be in both since they point to the same object*/ 
objB = [objA mutableCopy]; 
/*adding an object to one WILL NOT affect the other, they are different, distinct objects*/ 

डॉक्स में:

http://developer.apple.com/library/ios/#documentation/cocoa/Conceptual/Blocks/Articles/bxVariables.html#//apple_ref/doc/uid/TP40007502-CH6-SW1

यह कहा गया है कि जब ब्लॉक उनके सभी उद्देश्य-सी ऑब्जेक्ट्स की प्रतिलिपि बनाई गई है, जो एक मजबूत संदर्भ प्राप्त करते हैं ताकि ब्लॉक को निष्पादित करने से पहले वे दायरे से बाहर न आएं।