Iphone mutableCopyWithZone正在更新属性值

Iphone mutableCopyWithZone正在更新属性值,iphone,mutable,copywithzone,Iphone,Mutable,Copywithzone,我有一个需要复制的类,它能够在两个类上更改变量的值。简单地说,这些类需要始终保持彼此的克隆。我对文档的理解是,我可以使用类的浅层副本来实现这一点,该类也被声明为可变的。通过浅层复制,将克隆变量的指针值,使其在两个类中完全匹配。因此,当我更新原始中的变量时,副本将同时更新。是这样吗 正如您在下面看到的,我在我想要复制的类中使用了mutableCopyWithZone。我尝试了NSCopyObject和allocWithZone两种方法来实现这一点。虽然我能够复制类,并且它看起来像预期的那样,但在更

我有一个需要复制的类,它能够在两个类上更改变量的值。简单地说,这些类需要始终保持彼此的克隆。我对文档的理解是,我可以使用类的浅层副本来实现这一点,该类也被声明为可变的。通过浅层复制,将克隆变量的指针值,使其在两个类中完全匹配。因此,当我更新原始中的变量时,副本将同时更新。是这样吗

正如您在下面看到的,我在我想要复制的类中使用了mutableCopyWithZone。我尝试了NSCopyObject和allocWithZone两种方法来实现这一点。虽然我能够复制类,并且它看起来像预期的那样,但在更新变量时,它不会更改复制的类中的值

- (id)mutableCopyWithZone:(NSZone *)zone {

//ReviewViewer *copy = NSCopyObject(self, 0, zone);
ReviewViewer *copy = [[[self class] allocWithZone:zone] init];
copy->infoTextViews = [infoTextViews copy];
return copy;
}
infoTextViews是一个声明为非原子的属性,保留在被复制类的头文件中。我还相应地实现了NSMutableCopying协议


任何帮助都会很好。

你是对的,你想要的是一份浅的拷贝,但你要做的是一份深的拷贝。将[infoTextViews copy]更改为[infoTextViews retain]

小点。。allocWithZone?你的意思是allocWithZone:zone?普通的老阿洛克也许可以

为什么是可变CopyWithZone:?是否存在ReviewViewer的可变和不可变版本?您可能只需要copyWithZone:


注意:如果覆盖copyWithZone以执行浅层复制,则在复制对象的所有位置都指定此行为。

为什么不能在多个位置使用类的同一实例,而不是两个独立但相同的对象?这样就只有一个对象需要修改。一旦你做了一个拷贝(深拷贝或浅拷贝),你就有了两个独立的对象——对其中一个对象的更改不会传播到另一个对象。

oops,我的错。是的,我是说allocWithZone:zone我已经修改了上面的代码。谢谢我试过你的建议,但没什么不同。你的权利,它可能不需要是可变复制,但已经尝试了复制,我愿意尝试一切。可能真正的问题是我在类中调用一个方法,该方法被复制以更改变量的值。但这也没有意义,因为变量是UITextView,并且滚动在已复制的类上也不起作用。因此,让我们直截了当地说吧……您在没有将复制消息发送到infoTextViews对象的情况下尝试了它,但最终还是得到了2个infoTextViews对象?是,我尝试过在不使用copy或mutable属性的情况下修改上面的代码,并按照您的建议使用retain。该类仍然出现两次。然后,当我调用一个方法来更改该类上infoTextView的值时,此更改的值不会影响复制的类的此属性的共享实例。好的,我想在这里提供帮助,但似乎有其他事情可能正在发生。你问题的措辞暗示了相当大的混乱。我能计算出的最好结果是,你想复制一个对象'a',所以现在你在内存'a1'和'a2'中有两个不同的对象。“a1”和“a2”都共享一个实例变量“b”。你说‘真正的问题是我在类中调用一个被复制的方法来更改变量的值’——这毫无意义。您不能复制类或调用类方法。您暗示InfoTextView是一个UITextView。是这样吗?我想我现在明白了困惑所在。我误解了copyWithZone实际上在做什么。它不是创建一个新类,只是创建一个对象的附加实例。简言之,我试图做的事情不会按我希望的方式进行。是的,infoTextViews是一个UITextView,我希望此视图的委托与对原始视图所做的更改一致。嗯,回到绘图板上来。很抱歉给你带来了困惑。谢谢你的帮助。我已经试过了,但是由于某种原因,同一个类的第二个实例没有绘制我试图显示的文本。