2015-01-26 4 views
0

와 나는 NSCoding 프로토콜을 구현하는 내 사람 클래스가 : 인코딩 NSMutableArray를 부분적으로 NSKeyedArchiver

@interface Person : NSObject <NSCoding> 
@property NSString *name; 
@property float salary; 
@end 

@implementation Person 
-(void)encodeWithCoder:(NSCoder *)aCoder 
{ 

    [aCoder encodeObject:_name forKey:@"name"]; 
    [aCoder encodeFloat:_salary forKey:@"salary"]; 
} 

-(id)initWithCoder:(NSCoder *)aDecoder{ 
    if(self=[super init]) 
    { 
     _name =[aDecoder decodeObjectForKey:@"name"]; 
     _salary=[aDecoder decodeFloatForKey:@"salary"]; 
    } 
    return self; 

} 

이 또한 내가 직렬화하고 싶은 사람, 배열을 가지고있다. 그러나 모든 엔티티가 아닙니다. 나는 부분적으로 그것을 저장하고 싶다.

@interface customNSMutableArray : NSMutableArray<NSCoding> 
@end 

@implementation customNSMutableArray 

-(void)encodeWithCoder:(NSCoder *)aCoder 
{ 
    for(NSObject * obj in self) 
    { 
     //if(some_condition) 
      [aCoder encodeObject:obj]; 
    } 

} 

-(id)initWithCoder:(NSCoder *)aDecoder 
{ 
    //@todo 
    return self; 
} 

@end 

을 그리고 여기에 문제가 있습니다 : 나는 방법 initWithCoder NSCoding 프로토콜과 그것의 자신의 encodeWithCoder을 구현하는 것이다 NSMutableArray를내 자신의 서브 클래스를 생성하기로 결정했다. 내 customNSMutableArray를 인코딩하는 시도 후 : 내 customNSMutableArray

@property customNSMutableArray *companyStaff; 
... 
NSData * data=[NSKeyedArchiver archivedDataWithRootObject:_companyStaff]; 

encodeWithCoder 방법은 호출되지 않습니다. 직접 으로 전달됩니다. 내 인물 배열 내의 엔티티 인 encodeWithCoder입니다.

어떻게 부분적으로 NSMutableArray를 직렬화 할 수 있습니까?

+1

NSMutableArray 하위 클래스를 만드는 것은 좋지 않습니다. 그것은 "클래스 클러스터"의 일부입니다. 그리고 이것을 위해 어쨌든 서브 클래스를 만들 이유가 없습니다. 그냥'NSMutableArray' 전체를 archive/unarchive하십시오. – rmaddy

답변

0

PersonPartialPerson으로 하위 클래스화할 수 있습니다.이 파일은 보관/보관 취소 할 수 있습니다.

NSMutableArray를 하위 클래스로 만드는 것은 좋지 않습니다. 그렇게 할 이유가 없습니다.

+0

음 ... 나는 그것이 나를 위해 어떻게 도움이 될지 이해하지 못한다. 나는 몇몇 사람과 NSMutableArray있다. 내가 볼 수있는 유일한 방법은 NSMutableArray의 부분 복사본을 만들어 저장하는 것입니다. 그러나 Person 엔티티를 복제하기 위해서는 추가 RAM이 필요합니다 (또는 아닐까요?). –

관련 문제