2016-07-31 35 views
0

Nehmen Sie den Bruch mit den Eigenschaften int num und int deson und NSString * label an. Alles durch @property. Angenommen, wir stellen eine Kopiermethode zur Verfügung (nicht über das NSCopying-Protokoll), so können wirSo kopieren Sie ein Klassenobjekt in ein anderes Klassenobjekt

Bruch * g = [Bruch einige Initialisierer hier];

Bruch * f = [g Kopie];

Zeigen Sie genau, was in Fraction.h und Fraction.m benötigt wird, um dies flach zu bekommen.

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

gibt mir Fehler Thread 1: Signal SIGABRT

+0

Dies riecht nach einem sehr alten Tutorial oder einem Beispiel, das nicht von einer Foundation-Basisklasse abgeleitet ist. – bbum

Antwort

0

Die Kopiermethode Sie Teil einer bestehenden Instanz aufzurufen versuchen, ist, Es sollte eine neue Instanz als Ergebnis zurück.

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

Wie kann es zurückgeben, wenn es eine void Rückgabetyp ist? – user3436529

+0

@ user3436529 Es kann nicht; aber -copy sollte * niemals zurückkehren (void) *. Siehe: https://developer.apple.com/library/mac/documentation/Cocoa/Reference/Foundation/Protocols/NSCopying_Protocol/ Warum versuchen Sie, ein Objekt zu kopieren, ohne NSCopying einfach in dem empfohlenen, gut dokumentierten Muster zu implementieren? – bbum

+0

@ user3436529 - Danke, ich habe das beim Kopieren/Einfügen verpasst. Es wurde jetzt behoben –

0

Ihre Frage hat wegen der Wahl der Namen einige Verwirrung verursacht.

In Objective-C gibt es eine Standardmethode copy - durch NSObject umgesetzt wird - die ein brandneues Objekt zurückgibt, das ist eine Kopie oder ein Klon, des vorhandenen Objekts.

Ihr Titel:

Wie man ein Objekt der Klasse in einer anderen Klasse Objekt

könnte lesen, wie Sie mit den Werten eines anderen überschreiben ein vorhandenes Objekt zu wollen, kopieren, und Ihre copy: Methode tut genau das:

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

diese ersetzt/überschreibt die Werte der aktuellen Objekteigenschaften (self) mit den Werten der Eigenschaften eines anderen Objekts (f). In Objective-C copy: zu nennen ist eine schlechte Wahl aufgrund der Existenz von copy, die ein neues Objekt erzeugt.

Ihre Code-Fehler, wie Sie copy anrufen, nicht Ihre eigenen copy:. Versuchen Sie stattdessen:

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 

Diese Arbeit sollte aber ist verwirrend, da (a) es copy: genannt wird, und (b) es eigentlich nicht kopieren Sie die label Eigentum an allen als Aktien das gleiche Objekt zwischen f & g . Wenn das Objekt ist unveränderlich (NSString), die keinen Unterschied machen wird, aber wenn es wandelbar ist (NSMutableString) dann g mutiert s ‚s label auch f mutieren‘. \

Wenn Sie dies Sie vielleicht tun müssen, rufen Methode reinitFrom:, oder etwas, anstatt copy:.

HTH