2011-12-14 86 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