假设具有属性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
答案 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