2016-05-13 9 views
0

Ich versuche, ein Objekt zu kopieren, und ich habe das NSCopying Protokoll implementiert, die wie folgt aussieht:NSCopying Protokoll funktioniert nicht

#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; 
... 

Das, was Datei meiner Implementierung ist wie folgt aussieht:

#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; 
} 
... 

Wenn ich versuche, durch die Implementierung dieser Methode zu kopieren:

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

ich noch immer der Fehler:

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

Die Klasse MyActivity ist eine Unterklasse von RLMObject, so dass ich bin mir nicht sicher, ob das etwas mit dem Thema zu tun hat. Kann mir jemand in die richtige Richtung zeigen?

+0

Hat '' MyModel entsprechen 'NSCopying' – Lumialxk

Antwort

2

Realm intern überschreibt die Accessoren für die Eigenschaften, die es verwaltet, daher ist es nicht möglich, NSCopying im traditionellen Sinne zu entsprechen.

Wenn Sie a way to do this eine vollständige tiefe Kopie auf einem RLMObject, die Realm-JSON Bibliothek bietet tatsächlich auszuführen:

- (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; 
} 
Verwandte Themen