2011-12-14 89 views
0

我從NSObject的無法保存到PList

繼承了我自己的對象類
@interface BlockedCell : NSObject 
{ 
    NSValue *gridValue; 
    NSString *name; 
} 

@property (nonatomic, retain) NSValue *gridValue; 
@property (nonatomic, retain) NSString *name; 

@end 

所以我嘗試創建幾個對象:

NSMutableDictionary *dict = [[dict alloc] init]; 
for (int i = 0; i < 5; ++i) 
{ 
    BlockedCell *block = [[BlockedCell alloc] init]; 
    block.gridValue = [NSValue valueWithCGPoint: CGPointMake(0.0f, 0.0f)]; 
    block.name = @"something"; 
    [dict setObject: block forKey: [NSString stringWithFormat: @"item_%d", i]]; 
    [block release]; 
} 

if([dict writeToFile: path atomic: YES]) 
    NSLog(@"Saved"); 
else 
    NSLog(@"Failed to save"); 

[dict release]; 

而我得到的輸出是「無法保存」 .. 如果我的字典裏沒有包含任何數據,則輸出「拯救」

編輯: 我做更多的測試後,我發現居然是導致保存失敗的NSValue。 那麼如果我想將CGPoint保存爲plist,我該怎麼做?

回答

2

正如您發現的,屬性列表不能直接存儲NSValue對象。受支持的類是NSData,NSString,NSArray,NSDictionary,NSDate和NSNumber,如NSPropertyListSerialization Class Reference中所述。

最簡單的解決方法是使用NSString而不是NSValue

block.gridString = NSStringFromCGPoint(CGPointZero); 

CGPoint point = CGPointFromString(block.gridString); 
+0

謝謝,很好地解釋:) – 2011-12-14 05:39:10

1

你不能保存NSValue directly.In你的情況,你必須保存在下面一行表格ofstring使用點

CGPoint point = CGPointMake(10.0,20.0) //您需要將點轉換爲兼容的「Plist」對象,例如NSString //幸運的是,有一種方法可用於:

[rectArray addObject:NSStringFromPoint(point)];

//保存到的plist .....

該值

CGPoint點= CGPointFromString的檢索([rectArray objectAtIndex:0]);

+0

謝謝,最後我得到它的作品! – 2011-12-14 05:40:38