Apakah ada fungsi bawaan yang memungkinkan saya untuk menyalin secara mendalam NSMutableArray
?
Saya melihat sekeliling, beberapa orang mengatakan [aMutableArray copyWithZone:nil]
karya sebagai salinan dalam. Tapi saya mencoba dan tampaknya salinan yang dangkal.
Saat ini saya melakukan penyalinan secara manual dengan for
loop:
//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];
}
}
}
}
tapi saya ingin solusi yang lebih bersih, lebih ringkas.
-copy
pada koleksi yang tidak dapat diubah berubah antara Mac OS X 10.4 dan 10.5: developer.apple.com/library/mac/releasenotes/Cocoa/… (gulir ke bawah ke "Koleksi yang tidak dapat diubah dan perilaku penyalinan")
copy
, apa yang harus dimasukkan ke dalam "salinan dalam"? Jika elemennya adalah koleksi lain, copy
tidak benar-benar menghasilkan salinan (dari kelas yang sama). Jadi saya pikir sangat valid untuk berdebat tentang jenis salinan yang diinginkan dalam kasus tertentu.
NSCopying
/ -copy
, maka elemen itu tidak dapat disalin — jadi Anda tidak boleh mencoba membuat salinannya, karena itu bukanlah kemampuan yang dirancang untuk dimilikinya. Dalam hal penerapan Cocoa, objek yang tidak dapat disalin sering kali memiliki beberapa status backend C yang terkait dengannya, jadi meretas salinan langsung objek dapat menyebabkan kondisi balapan atau lebih buruk. Jadi untuk menjawab "apa yang harus dimasukkan ke dalam 'salinan dalam'" - A dipertahankan ref. Satu-satunya benda yang dapat Anda letakkan di mana saja jika Anda memiliki non- NSCopying
objek.