【问题标题】:Crashing On CopyWithZone: MethodCopyWithZone 崩溃:方法
【发布时间】: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]] 一起使用;还有……
  • 该语句不会出错,但不会“复制”它。

标签: ios nscopying


【解决方案1】:

并非所有NSObject 子类都采用NSCopying 协议。问题听起来像是您将此消息发送到无法识别的对象。

你的GroupClass采用NSCopying没关系,这不是问题。你在 myObj 上调用 copyWithZone:,不管它是什么。

这行代码:

copy.myObj=[myObj copyWithZone: zone];

几乎可以肯定是导致崩溃的原因。

编辑

不知道 myObj 是什么,我会建议,如果可能,并且不是一个坏主意,你可以继承任何类。

例如,如果它是一个 UIView,我会像这样子类化它:

@class JVView : UIView <NSCopying>

然后我会适当地实现copyWithZone: 方法,复制您认为必要的实例的任何属性。

【讨论】:

  • 那我该怎么办?我应该为 myObj 创建子类吗?
猜你喜欢
  • 2023-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多