如何将类对象复制到另一个类对象

时间:2016-07-31 19:00:22

标签: objective-c class copy shallow-copy

假设具有属性int num和int denom以及NSString * label的Fraction。全部通过@property。假设我们提供复制方法(不是通过NSCopying协议),所以我们可以做

分数* g = [这里有一些初始化器的分数];

分数* f = [g copy];

准确显示Fraction.h和Fraction.m中需要的内容以使其变浅。

-(void) copy: (Fraction*) f {
    self.num = f.num;
    self.denom = f.denom;
    self.label = f.label;
}

给我错误线程1:信号SIGABRT

2 个答案:

答案 0 :(得分:0)

您尝试调用的复制方法是现有实例的一部分, 它应该返回一个新实例。

-(Fraction *) copy {
    return [Fraction alloc] initWithNum:self.num denom:self.denom label:self.label];
}

答案 1 :(得分:0)

由于名字的选择,你的问题引起了一些混乱。

在Objective-C中有一种标准方法copy - 它由NSObject实现 - 它返回一个全新的对象,它是一个副本或一个克隆,现有对象。

你的头衔:

  

如何将类对象复制到另一个类对象

可以读取,因为您希望覆盖现有对象的值为另一个,并且您的copy:方法完全相同:

-(void) copy: (Fraction*) f {
    self.num = f.num;
    self.denom = f.denom;
    self.label = f.label;
}

使用另一个对象属性(self)的值替换/覆盖当前(f)对象属性的值。在Objective-C中调用它copy:是一个糟糕的选择,因为copy的存在会创建一个新对象。

您拨打copy时出现代码错误,而不是您自己的copy:。请尝试改为:

Fraction *g = [Fraction some initializer here]; // your original object
Fraction *f = [Fraction new]; // another object, with some default values

[f copy:g]; // set f's properties from g's

这应该有效,但令人困惑,因为(a)它被称为copy:和(b)它实际上并不复制label属性,而是共享 f&之间的同一个对象g。如果该对象是不可变的(NSString),它不会产生任何差异,但如果它是可变的(NSMutableString),那么变异g的{​​{1}}也会变异{ {1}}的。\

如果您必须这样做,可以拨打您的方法label或其他内容,而不是f

HTH