Derin kopyalama yapmama izin veren herhangi bir yerleşik işlev var NSMutableArraymı?
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 fordö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, copyaslı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. NSCopyingNesne olmayan bir şeyiniz olduğunda her yere koyabileceğiniz tek şey .