【发布时间】:2014-04-15 06:27:35
【问题描述】:
我创建了一个类,它是 NSObject(nsme 作为 GroupClass)的子类。在该类中,我创建了一个属于“id”的属性,例如
@property(nonatomic,retain)id myObj;
现在我正站在我拥有一个可变数组的路上,该数组包含我的 GroupClass 的实例。所以我以类似的方式获得一份副本
GroupClass* objG=[array objectAtIndex:i];
现在我想要另一个 objG 的副本。我搜索了。我找到了 NSCopying 协议。所以我将 NSCopying 作为委托添加到 GroupClass 并添加了 copyWithZone 方法。这里是
-(id)copyWithZone:(NSZone *)zone
{
GroupClass *copy = [[[self class] allocWithZone: zone] init];
copy.myObj=[myObj copyWithZone: zone];
return copy;
}
这里我需要深拷贝。但它总是在分配行后崩溃。请帮助我。谢谢。
【问题讨论】:
-
myObj 的类类型未知,那么 [myObj copyWithZone...] 如何工作?也许 myObj 甚至没有实现 copyWithZone 方法。您需要知道它的类型是什么,将其转换为该类型,如果存在则调用它的 copyWithZone 方法。如果 id myObj 是 GroupClass 的类型,那么它会导致无休止的递归调用和崩溃
-
那么如果我写 [copy setmyObj:[self myObj]]; ?如果我使用这条线,那么它将允许复制,但该复制将浅复制。我需要深复制。
-
不,它不会,它只是一个参考(浅拷贝)。 myObj 的类型是什么?
-
这就是我所说的,如果它因为“id”类型而崩溃,那么它不应该与 [copy setmyObj:[self myObj]] 一起使用;还有……
-
该语句不会出错,但不会“复制”它。