มีฟังก์ชั่นในตัวที่ช่วยให้ฉันคัดลอกแบบลึกได้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
คอลเลกชันที่เปลี่ยนรูปไม่ได้เปลี่ยนไประหว่าง Mac OS X 10.4 และ 10.5: developer.apple.com/library/mac/releasenotes/Cocoa/… (เลื่อนลงไปที่ "ไม่เปลี่ยนรูปคอลเล็กชันและพฤติกรรมการคัดลอก")
copy
จะต้องใส่อะไรลงไปใน "สำเนาลึก"? หากองค์ประกอบเป็นคอลเล็กชันอื่นcopy
จะไม่ส่งสำเนา (ของคลาสเดียวกัน) ดังนั้นฉันคิดว่ามันถูกต้องสมบูรณ์ที่จะโต้แย้งเกี่ยวกับประเภทของสำเนาที่ต้องการในกรณีเฉพาะ
NSCopying
/ -copy
แสดงว่าไม่สามารถคัดลอกได้ - ดังนั้นคุณไม่ควรพยายามทำสำเนาเพราะนั่นไม่ใช่ความสามารถที่ออกแบบมาให้มี ในแง่ของการใช้งาน Cocoa วัตถุที่ไม่สามารถคัดลอกได้มักจะมีสถานะแบ็กเอนด์ C ที่เชื่อมโยงอยู่ดังนั้นการแฮ็กสำเนาโดยตรงของวัตถุอาจนำไปสู่สภาพการแข่งขันหรือแย่ลง ดังนั้นเพื่อตอบว่า "สิ่งที่จะใส่ลงใน 'สำเนาลึก'" - การอ้างอิงที่เก็บรักษาไว้ สิ่งเดียวที่คุณสามารถใส่ได้ทุกที่เมื่อคุณมีสิ่งที่ไม่ใช่NSCopying
วัตถุ