Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何进行深度复制Objective-C_Objective C_Copying - Fatal编程技术网

如何进行深度复制Objective-C

如何进行深度复制Objective-C,objective-c,copying,Objective C,Copying,有一个类具有以下属性: @property (strong, nonatomic) NSString *name; @property (strong, nonatomic) Symptoms *symptoms; @property (assign, nonatomic) Status status; @property (weak, nonatomic) id <PatientDelegate> delegate; 这两个类都实现协议复制: - (nonnull id)copy

有一个类具有以下属性:

@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) Symptoms *symptoms;
@property (assign, nonatomic) Status status;
@property (weak, nonatomic) id <PatientDelegate> delegate;
这两个类都实现协议复制:

- (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方法并处理当前患者时,历史上有指向此对象的链接,该对象具有正确的属性值。一旦我们退出该方法或开始处理另一名患者,所有属性值都将重置为初始值

我试图实现复制,但还是出了问题


当您想要深度复制对象时,必须在所有子结构上实现
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

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