Derin kopyalama yapmama izin veren herhangi bir yerleşik işlev var NSMutableArray
mı?
Etrafıma baktım, bazıları diyor ki [aMutableArray copyWithZone:nil]
eserlerin derin kopya . Ama denedim ve sığ bir kopya gibi görünüyor.
Şu anda kopyayı bir for
döngü ile manuel olarak yapıyorum :
//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];
}
}
}
}
ama daha temiz, daha özlü bir çözüm istiyorum.
-copy
, değişmez koleksiyonlardaki davranışının Mac OS X 10.4 ve 10.5 arasında değişmesidir: developer.apple.com/library/mac/releasenotes/Cocoa/… ("Değişmez koleksiyonlar ve kopyalama davranışı" na gidin)
copy
, "derin kopyaya" ne konulmalıdır? Öğe başka bir koleksiyonsa, copy
aslında (aynı sınıfın) bir kopyasını vermez. Bu nedenle, belirli bir durumda istenen kopyanın türü hakkında tartışmanın tamamen geçerli olduğunu düşünüyorum.
NSCopying
/ uygulamazsa -copy
, o zaman kopyalanamaz - bu yüzden asla onun bir kopyasını yapmaya çalışmamalısınız, çünkü bu sahip olması için tasarlanmış bir yetenek değildir. Cocoa'nın uygulanması açısından, kopyalanamayan nesneler genellikle bağlı oldukları bazı C arka uç durumuna sahiptir, bu nedenle nesnenin doğrudan bir kopyasını kesmek yarış koşullarına veya daha kötüsüne yol açabilir. Öyleyse, “'derin kopyaya ne konulacak” yanıtını vermek için - A tutulan bir referans. NSCopying
Nesne olmayan bir şeyiniz olduğunda her yere koyabileceğiniz tek şey .