2016-05-13 7 views
0

私はオブジェクトをコピーしようとしている、と私はこのようになりますNSCopyingプロトコルを実装しました:NSCopyingプロトコルが動作しない

#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; 
} 
... 
:これは私の実装ファイルは、次のようになります

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

- (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; 
} 
関連する問題