이것은 큰 질문이며, 나는 항상 그것에 대해 궁금해했습니다. 그래서, 그것을 시험해보기 위해 작은 테스트 프로그램을 작성했습니다. 네 클래스 : ClassA
, ClassB
, ClassC
및 MyBaseClass
. ClassA
, ClassB
및 ClassC
은 NSCoding
에 부합하며 name
및 age
의 두 가지 속성을 제공합니다. ClassA
및 ClassB
에 ClassC
의 인스턴스에 대한 참조가 포함되어 있다는 점을 제외하면 A, B 및 C 클래스는 동일합니다. ClassA
및 ClassB
도 initwithCoder:
및 encodeWithCoder:
을 덮어 쓰고 ClassC
의 인스턴스에 대한 참조를 디코딩하고 인코딩합니다. 다음은 최상위 코드의 모습입니다.
ClassA *a = [[ClassA alloc] initWithName:@"Mr. A" age:11];
ClassB *b = [[ClassB alloc] initWithName:@"Mrs. B" age:22];
ClassC *c = [[ClassC alloc] initWithName:@"Ms. C" age:33];
b.c = c;
a.c = c;
NSArray *rootObject = @[a, b, c];
NSString *const kFilePath = @"/Users/myname/Documents/testarchive";
BOOL result = [NSKeyedArchiver archiveRootObject:rootObject toFile:kFilePath];
NSLog(@"result = %@", (result) ? @"YES" : @"NO");
NSArray *newRootObject = [NSKeyedUnarchiver unarchiveObjectWithFile:kFilePath];
NSLog(@"new root object = %@", newRootObject);
개체가 완벽하게 직렬화 및 비 직렬화됩니다. 또한 비 직렬화 후 a.c
및 b.c
은 ClassC
의 동일한 인스턴스를 가리 킵니다. 즉, 해당 객체 포인터의 주소가 동일합니다. 객체가 이전에 부호화 대상 isEqualTo:
부호화되는 경우 NSKeyedArchiver
의 encodeObject:forKey:
내의 명백하게
는 시험 보러 수행되고,이 경우, 기준 대신에 완전한 객체에 저장된다. 그 반대는 NSKeyedUnarchiver
의 decodeObject:forKey:
에서 발생해야합니다. 아주 멋지다!
그래, 나는 대개 대리인을 인코딩하지 않을거야. 나는 짧은 순간에 더 좋은 예를 생각할 수 없었다. 나는 내 실제 상황을 사용할 수 있다고 생각하지만 필요한 것보다 더 타이핑을했다. 어쨌든, 고마워! –
걱정할 필요가 없습니다. 단지 확인하고 싶습니다. :) – bbum