Как сделать глубокое копирование Objective-C - PullRequest
0 голосов
/ 28 апреля 2018

Есть класс Пациент со свойствами:

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) Symptoms *symptoms;
@property (assign, nonatomic) Status status;
@property (weak, nonatomic) id <PatientDelegate> delegate;

Есть класс Симптомы со свойствами:

@property (assign, nonatomic) CGFloat temperature;
@property (assign, nonatomic) BOOL headache;
@property (assign, nonatomic) BOOL stomach_ache;

Оба класса реализуют протокол NSCopying:

- (nonnull id)copyWithZone:(nullable NSZone *)zone {
    Patient *newPatient = [[[self class] allocWithZone:zone] init];
    [newPatient setName:self.name];
    [newPatient setSymptoms:self.symptoms];
    [newPatient setStatus:self.status];
    [newPatient setDelegate:self.delegate];
    return newPatient;
 }

- (nonnull id)copyWithZone:(nullable NSZone *)zone {
    Symptoms *newSymptoms = [[[self class] allocWithZone:zone] init];
    [newSymptoms setTemperature:self.temperature];
    [newSymptoms setHeadache:self.headache];
    [newSymptoms setStomach_ache:self.stomach_ache];
    return newSymptoms;
}

Также есть класс Доктор:

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSMutableArray *history;

- (void)makeNoteIn:(Patient *)patient card:(NSMutableArray *)history;
- (void)report;

Когда пациент выздоравливает, врач вызывает метод makeNoteIn:

- (void)makeNoteIn:(Patient *)patient card:(NSMutableArray *)history {
    Patient *newRecord = [patient copy];

    [history addObject:newRecord];
}

После того, как запись сделана, все свойства пациента возвращаются к исходным значениям. Пока мы находимся в методе makeNoteIn, и текущий пациент обработан, в истории есть ссылка на этот объект, который имеет правильные значения свойств. Как только мы выйдем из метода или начнем лечение другого пациента, все значения свойств будут сброшены до начального значения.

Я пытался реализовать копирование, но что-то все равно не так.

Describing of Patient and Symptoms classes

Situation when link on object was added to history, and object has right values

Situation when we went out from method makeNoteIn and objects has initial (wrong) values in history array

1 Ответ

0 голосов
/ 28 апреля 2018

Если вы хотите глубоко скопировать объект, вы должны реализовать copy на всех подструктурах:

[newPatient setName:[self.name copy]];
[newPatient setSymptoms:[self.symptoms copy]];

В противном случае они все равно будут ссылаться на один и тот же объект, и изменение одного повлияет на все.

Обратите внимание, что вы можете сделать это автоматически, объявив свойства как copy:

@property (copy, nonatomic) NSString *name;
@property (copy, nonatomic) Symptoms *symptoms;

Обычно copy используется с NSString и NSArray для предотвращения присвоения NSMutableString и NSMutableArray, которые могут быть внешне изменены по ошибке. Убедитесь, что вы внедрили NSCopying на Symptoms.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...