2016-05-13 103 views
0

我試圖複製一個對象,我已經實現了NSCopying協議,它看起來像這樣:NSCopying協議不工作

#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一個子類,所以我不知道這有什麼關係的問題。有人能指引我朝着正確的方向嗎?

+0

沒有''爲MyModel符合'NSCopying' – Lumialxk

回答

2

領域內部覆蓋所管理屬性的訪問器,因此無法使其符合傳統意義上的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; 
}