क्या कोई अंतर्निहित कार्य है जो मुझे गहरी कॉपी करने की अनुमति देता है NSMutableArray
?
मैंने चारों ओर देखा, कुछ लोग कहते हैं [aMutableArray copyWithZone:nil]
कि गहरी नकल के रूप में काम करता है। लेकिन मैंने कोशिश की और यह उथली प्रति प्रतीत हो रही है।
अभी मैं स्वयं एक for
लूप के साथ कॉपी कर रहा हूं :
//deep copy a 9*9 mutable array to a passed-in reference array
-deepMuCopy : (NSMutableArray*) array
toNewArray : (NSMutableArray*) arrayNew {
[arrayNew removeAllObjects];//ensure it's clean
for (int y = 0; y<9; y++) {
[arrayNew addObject:[NSMutableArray new]];
for (int x = 0; x<9; x++) {
[[arrayNew objectAtIndex:y] addObject:[NSMutableArray new]];
NSMutableArray *aDomain = [[array objectAtIndex:y] objectAtIndex:x];
for (int i = 0; i<[aDomain count]; i++) {
//copy object by object
NSNumber* n = [NSNumber numberWithInt:[[aDomain objectAtIndex:i] intValue]];
[[[arrayNew objectAtIndex:y] objectAtIndex:x] addObject:n];
}
}
}
}
लेकिन मैं एक क्लीनर, अधिक रसीला समाधान चाहूंगा।
-copy
मैक ओएस एक्स 10.4 और 10.5 के बीच अपरिवर्तनीय संग्रह का व्यवहार बदल गया है: developer.apple.com/library/mac/releasenotes/Cocoa/ ... ("अपरिवर्तनीय संग्रह और कॉपी व्यवहार के लिए नीचे स्क्रॉल करें")
copy
, तो "गहरी प्रति" में क्या डाला जाएगा? यदि तत्व एक और संग्रह है, copy
तो वास्तव में एक प्रति (एक ही वर्ग) की उपज नहीं होती है। इसलिए मुझे लगता है कि विशिष्ट मामले में वांछित कॉपी के प्रकार के बारे में बहस करना पूरी तरह से वैध है।
NSCopying
/ करती है -copy
, तो यह प्रतिलिपि योग्य नहीं है - इसलिए आपको इसकी प्रतिलिपि बनाने की कोशिश कभी नहीं करनी चाहिए, क्योंकि यह एक ऐसी क्षमता नहीं है जिसे इसे डिजाइन किया गया था। कोको के कार्यान्वयन के संदर्भ में, गैर-प्रतिलिपि योग्य वस्तुओं में अक्सर कुछ सी बैकएंड राज्य होते हैं जो वे बंधे होते हैं, इसलिए ऑब्जेक्ट की डायरेक्ट-कॉपी हैक करने से दौड़ की स्थिति या इससे भी बदतर हो सकती है। तो जवाब देने के लिए "गहरी प्रतिलिपि में क्या रखा जाएगा" - एक बनाए रखा रेफरी। केवल एक चीज जिसे आप कहीं भी रख सकते हैं जब आपके पास कोई गैर- NSCopying
वस्तु हो।