這是一個很好的問題,我一直都在想自己。所以,我寫了一個小測試程序來試用。四類:ClassA
,ClassB
,ClassC
和MyBaseClass
。 ClassA
,ClassB
和ClassC
繼承自MyBaseClass
,其符合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
的相同實例 - 也就是說,它們的對象指針具有相同的地址。
顯然,內NSKeyedArchiver
的encodeObject:forKey:
,進行測試做,以查看是否正被編碼isEqualTo:
物體的先前編碼的對象,並且如果它是,參考被存儲,而不是一個完整的對象。相反必須發生在NSKeyedUnarchiver
的decodeObject:forKey:
。很酷!
是的,我通常不會編碼一個代表。我無法在短時間內想到一個更好的例子。我想我可以使用我的實際情況,但我比所需要的輸入更多。無論如何,謝謝! –
不用擔心 - 只是想確認一下。 :) – bbum