2016-07-31 176 views
0

假定具有属性int num和int denom和NSString * label的分数。全部通过@property。假设我们提供复制方法(不通过NSCopying协议),所以我们可以做如何将类对象复制到另一个类对象

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

Fraction * 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

这听起来像是一个非常古老的教程或不是从基础基类派生的例子。 – bbum

回答

0

您要调用的复制方法是现有实例的一部分, 它应该返回一个新的实例作为结果。

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

它是什么时候返回,当它是一个void返回类型? – user3436529

+0

@ user3436529它不能;但-copy应该永远不会返回(void)*。请参阅:https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSCopying_Protocol/您为什么要复制一个对象而不简单地在建议的,有据可查的模式中实现NSCopying? – bbum

+0

@ user3436529 - 谢谢我错过了复制/粘贴。现在修复它 –

0

由于名称的选择,您的问题引起了一些混淆。

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

你的标题:

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

可以理解为您希望覆盖用另一个值的现有对象,您的copy:方法确实如此:

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

This 用当前(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),然后变异glabel也将变异f的。\

如果你必须这样做,也许你打电话方法reinitFrom:,或其他东西,而不是copy:

HTH

相关问题