2016-07-31 135 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

相關問題