【发布时间】:2012-10-30 00:09:31
【问题描述】:
我有一个 NSMutableArray 的自定义对象(基于 NSObject),我想将其复制到一个新数组中。但我希望它是一个深拷贝。
我该怎么做呢?我需要在我的自定义对象中实现 NSCopying 协议吗?
谢谢
【问题讨论】:
标签: objective-c nsmutablearray copy nsarray deep-copy
我有一个 NSMutableArray 的自定义对象(基于 NSObject),我想将其复制到一个新数组中。但我希望它是一个深拷贝。
我该怎么做呢?我需要在我的自定义对象中实现 NSCopying 协议吗?
谢谢
【问题讨论】:
标签: objective-c nsmutablearray copy nsarray deep-copy
是的,您需要指出您的自定义类遵循NSCopying 协议,然后您实现copyWithZone: 方法。这允许复制您的课程。在copyWithZone: 的实现中,您需要确定有多少内部结构还需要深度复制。
现在,如果您对数组进行深拷贝,新数组将包含对象的复制版本,而不仅仅是对原始对象的引用。
请注意,数组的常规副本不会进行深度复制。要制作深层副本,您需要以下内容:
NSArray *deepCopyArray=[[NSArray alloc] initWithArray:someArray copyItems:YES];
【讨论】:
copy 会进行深层复制。我说明了如何确保自定义对象是可复制的。然后我提到如果制作了数组的深层副本...
可以通过手动遍历所有元素来深度复制数组。如果对象需要进一步的深度复制,这是必要的。
NSMutableArray *deepCopied = [NSMutableArray arrayWithCapacity:[array count]];
// assumes your objects know how to "deepCopy"
for (id object in array)
{
// if not ARC or GC:
[deepCopied addObject:[[object deepCopy] aurorelease]];
// if ARC or GC
[deepCopied addObject:[object deepCopy]];
}
否则:
NSArray *deepCopied = [[NSArray alloc] initWithArray:array copyItems:YES];
答案here 中描述了一种分类方法,如果您需要制作大量深拷贝,可能会有所帮助。
【讨论】: