2011-10-15 21 views
4

我有一個擴展NSString的自定義類。我試圖使用NSKeyedArchiver來序列化它(用於拖放)。該類覆蓋...Coder方法:NSKeyedArchiver返回意外的類嗎?

- (id)initWithCoder:(NSCoder *)aDecoder { 
    if ((self = [super initWithCoder:aDecoder])) { 
     data = [[aDecoder decodeObjectForKey:@"data"] copy]; 
    } 
    return self; 
} 

- (void)encodeWithCoder:(NSCoder *)aCoder { 
    [super encodeWithCoder:aCoder]; 
    [aCoder encodeObject:self.data forKey:@"data"]; 
} 

但是,當我嘗試實際上是通過歸檔/解檔運行:

MyClass *object = [[MyClass alloc] init]; 
[pboard setData:[NSKeyedArchiver archivedDataWithRootObject:object] forType:SACP_WRAPPER_DRAG_TYPE]; 
NSLog(@"Wrote data for class %@", [object class]); 

... 

id item = [NSKeyedUnarchiver unarchiveObjectWithData:[[info draggingPasteboard] dataForType:SACP_WRAPPER_DRAG_TYPE]]; 
NSLog(@"Read data for class %@", [item class]); 

輸出是不是我期待:

2011-10-15 18:56:22.898 MyApp[7402:707] Wrote data for class ASCIIString 
2011-10-15 18:56:23.345 MyApp[7402:707] Read data for class __NSCFString 

回答

5

NSString是class cluster

「的NSString是一類集羣,與其他類型的基礎如NSNumber的和的NSArray沿着:

類簇是一個設計圖案,基金會框架廣泛使用的。類集羣在一個公共的抽象超類下組合了許多私有的具體子類。以這種方式對類進行分組簡化了面向對象框架的公共可見體系結構,而不會降低其功能豐富性。類集羣基於「可可設計模式」中討論的抽象工廠設計模式。「

請確保您閱讀NSString doc中的」子類註釋「...您必須爲您的子類實現自定義存儲機制。我的猜測是,你沒有這樣做,或者如果你是這樣,當你撥打super的NSCoding方法時,你仍然看到那些私人類彈出,因爲super將使用特定的私有類的方法表示NSString指(取決於其內容)