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

Это пахнет либо очень старым учебником, либо примером, не полученным из базового класса Foundation. – 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; 
} 

это заменяет/перезаписывает значения свойств текущего объекта (self) со значениями свойств другого объекта (f). Вызов copy: в Objective-C является плохим выбором из-за существования 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 

Это должно работать, но сбивает с толку, как (а) называется copy: и (б) он фактически не копировать label собственность на всех, но акций тот же объект между f & g , Если этот объект является неизменяемым (NSString), что не будет никакой разницы, но если это изменяемые (NSMutableString), то мутирует g «s label также мутирует f» с. \

Если вы должны сделать это, может быть, позвоните в метод reinitFrom:, или что-то, а не copy:.

HTH

Смежные вопросы