gpt4 book ai didi

ios - NSCopying 协议(protocol)不工作

转载 作者:行者123 更新时间:2023-11-28 21:28:30 24 4
gpt4 key购买 nike

我正在尝试复制一个对象,我已经实现了 NSCopying 协议(protocol),它看起来像这样:

#MyActivity.h
@interface MyActivity : MyModel <NSCopying>
{
NSInteger activityId;
NSInteger userId;
NSInteger checkinId;
NSString *status;
NSString *dateCreated;
NSString *dateModified;
NSString *dateStart;
NSString *dateEnd;
NSString *activityDescription;
NSString *name;
NSString *type;
NSString *repeat;
NSString *routineName;
NSString *startTimezone;
NSString *endTimezone;
GUILocation *location;
}

@property NSInteger activityId;
@property NSInteger userId;
@property NSInteger checkinId;

@property (nonatomic, strong) NSString *status;
@property (nonatomic, strong) NSString *dateCreated;
@property (nonatomic, strong) NSString *dateModified;
@property (nonatomic, strong) NSString *dateStart;
@property (nonatomic, strong) NSString *dateEnd;
@property (nonatomic, strong) NSString *activityDescription;
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSString *type;
@property (nonatomic, strong) NSString *repeat;
@property (nonatomic, strong) NSString *routineName;
@property (nonatomic, strong) NSString *startTimezone;
@property (nonatomic, strong) NSString *endTimezone;

@property (nonatomic, strong) MyLocation *location;

-(id)copyWithZone:(NSZone *)zone;
...

这是我的实现文件的样子:

#MyActivity.m
...
-(id)copyWithZone:(NSZone *) zone
{
GUIActivity* copyActivity = [super copyWithZone:zone];
copyActivity.activityId = self.activityId;
copyActivity.userId = self.userId;
copyActivity.checkinId = self.checkinId;
copyActivity.status = self.status;
copyActivity.dateCreated = self.dateCreated;
copyActivity.dateModified = self.dateModified;
copyActivity.dateStart = self.dateStart;
copyActivity.dateEnd = self.dateEnd;
copyActivity.activityDescription = self.activityDescription;
copyActivity.name = self.name;
copyActivity.type = self.type;
copyActivity.repeat = self.repeat;
copyActivity.routineName = self.routineName;
copyActivity.startTimezone = self.startTimezone;
copyActivity.endTimezone = self.endTimezone;
copyActivity.location = [self.location copyWithZone:zone];


return copyActivity;
}
...

当我尝试通过实现此方法进行复制时:

- (void)addActivity:(MyActivity *)activity
toResults:(NSMutableArray *)results
withDate:(NSDate *)date
{
MyActivity *actNow = [activity copy];
actNow.dateStart = [NSDate stringFromDate:date];
[results addObject:actNow];
}

我仍然收到错误:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[RLMAccessor_v0_MyActivity copyWithZone:]: unrecognized selector sent to instance 0x7fe5e0c2c0a0'

MyActivityRLMObject 的子类,所以我不确定这是否与问题有关。有人能指出我正确的方向吗?

最佳答案

Realm 在内部覆盖了它管理的属性的访问器,因此不可能使其符合传统意义上的 NSCopying

如果你想对一个RLMObject进行完整的深拷贝,Realm-JSON库实际上提供了a way to do this :

- (instancetype)deepCopy {
RLMObject *object = [[NSClassFromString(self.objectSchema.className) alloc] init];

for (RLMProperty *property in self.objectSchema.properties) {

if (property.type == RLMPropertyTypeArray) {
RLMArray *thisArray = [self valueForKeyPath:property.name];
RLMArray *newArray = [object valueForKeyPath:property.name];

for (RLMObject *currentObject in thisArray) {
[newArray addObject:[currentObject deepCopy]];
}

}
else if (property.type == RLMPropertyTypeObject) {
RLMObject *value = [self valueForKeyPath:property.name];
[object setValue:[value deepCopy] forKeyPath:property.name];
}
else {
id value = [self valueForKeyPath:property.name];
[object setValue:value forKeyPath:property.name];
}
}

return object;
}

关于ios - NSCopying 协议(protocol)不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37200300/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com