无法保存到plist

时间:2011-12-14 05:06:35

标签: objective-c

我有自己的继承自NSObject

的对象类
@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 个答案:

答案 0 :(得分:2)

如您所见,属性列表无法直接存储NSValue个对象。受支持的类是NSData,NSString,NSArray,NSDictionary,NSDate和NSNumber,如NSPropertyListSerialization Class Reference中所述。

最简单的解决方法是使用NSString代替NSValue

block.gridString = NSStringFromCGPoint(CGPointZero);

CGPoint point = CGPointFromString(block.gridString);

答案 1 :(得分:1)

你不能直接保存NSValue。在你的情况下你必须以线下使用的形式保存一个点

CGPoint point = CGPointMake(10.0,20.0) //您需要将该点转换为兼容的“Plist”对象,例如NSString //幸运的是,有一种方法

[rectArray addObject:NSStringFromPoint(point)];

//保存到plist中 .....

检索此值

CGPoint Point = CGPointFromString([rectArray objectAtIndex:0]);