Có chức năng tích hợp nào cho phép tôi sao chép sâu NSMutableArray
không?
Tôi nhìn xung quanh, một số người nói [aMutableArray copyWithZone:nil]
hoạt động như bản sao sâu. Nhưng tôi đã thử và nó có vẻ là một bản sao nông cạn.
Ngay bây giờ tôi đang thực hiện thủ công sao chép với một for
vòng lặp:
//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];
}
}
}
}
nhưng tôi muốn một giải pháp gọn gàng hơn, ngắn gọn hơn.
-copy
tập hợp bất biến đã thay đổi giữa Mac OS X 10.4 và 10.5: developer.apple.com/library/mac/releasenotes/Cocoa/… (cuộn xuống "Tập hợp bất biến và hành vi sao chép")
copy
, cái gì sẽ được đưa vào "bản sao sâu"? Nếu phần tử là một tập hợp khác, copy
không thực sự mang lại một bản sao (của cùng một lớp). Vì vậy, tôi nghĩ rằng việc tranh luận về loại bản sao muốn có trong trường hợp cụ thể là hoàn toàn hợp lệ.
NSCopying
/ -copy
thì nó không thể sao chép được— vì vậy bạn đừng bao giờ cố tạo bản sao của nó, vì đó không phải là khả năng mà nó được thiết kế để có. Về cách triển khai của Cocoa, các đối tượng không thể sao chép thường có một số trạng thái phụ trợ C mà chúng được gắn vào, vì vậy việc hack bản sao trực tiếp của đối tượng có thể dẫn đến điều kiện chủng tộc hoặc tệ hơn. Vì vậy, để trả lời "những gì sẽ được đưa vào 'bản sao sâu'" - Một tham chiếu được giữ lại. Thứ duy nhất bạn có thể đặt ở bất cứ đâu khi bạn có một NSCopying
vật không phải là đối tượng.