【问题标题】:Storing Custom Object in NSMutableDictionary在 NSMutableDictionary 中存储自定义对象
【发布时间】:2011-04-11 18:41:31
【问题描述】:

我正在尝试将自定义对象存储在 NSMutableDictionary 中。当我从 NSMutableDictionary 读取对象时保存后,它始终为空。

这里是代码

//保存

NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];

CustomObject *obj1 = [[CustomObject alloc] init];
obj1.property1 = @"My First Property";

[dict setObject:obj1 forKey:@"FirstObjectKey"];
[dict writeToFile:[self dataFilePath] atomically:YES];

// 阅读

 NSString *filePath = [self dataFilePath];
        NSMutableDictionary *dict = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];

        CustomObject *tempObj = [dict objectForKey:@"FirstObjectKey"];

        NSLog(@"Object %@", tempObj);
        NSLog(@"property1:%@,,tempObj.property1);

如何在 NSMutableDictionary 中存储自定义类对象?

【问题讨论】:

  • NSLog 输出告诉你什么?您能否读取文件以验证您的对象是否正确写入?
  • 2011-04-11 19:31:14.386 Persistence[1757:207] Object (null) 2011-04-11 19:31:14.388 Persistence[1757:207] property1:(null)
  • -[NSDictionary writeToFile:atomically:] 返回一个BOOL。你有没有想过检查结果?

标签: objective-c cocoa-touch nsmutabledictionary


【解决方案1】:

问题不在于将对象放入字典;问题在于将其写入文件。

您的自定义类必须是serializable。您需要实现 NSCoding protocol 以便 Cocoa 在您要求将其写入磁盘时知道如何处理您的类。

这很简单;您需要实现两个方法,如下所示:

- (id)initWithCoder:(NSCoder *)coder {
    self = [super init];
    // If inheriting from a class that implements initWithCoder:
    // self = [super initWithCoder:coder];
    myFirstIvar = [[coder decodeObjectForKey:@"myFirstIvar] retain];
    mySecondIvar = [[coder decodeObjectForKey:@"mySecondIvar] retain];
    // etc.

    return self;
}

- (void)encodeWithCoder:(NSCoder *)coder {
    // If inheriting from a class that implements encodeWithCoder:
    // [super encodeWithCoder:coder];
    [coder encodeObject:myFirstIvar forKey:@"myFirstIvar"];
    [coder encodeObject:mySecondIvar forKey:@"mySecondIvar"];
    // etc.
}

基本上你只是列出你需要保存的 ivars,然后正确地读回它们。

更新:正如 Eimantas 所述,您还需要NSKeyedArchiver。保存:

NSData * myData = [NSKeyedArchiver archivedDataWithRootObject:myDict];
BOOL result = [myData writeToFile:[self dataFilePath] atomically:YES];

重新加载:

NSData * myData = [NSData dataWithContentsOfFile:[self dataFilePath]];
NSDictionary * myDict = [NSKeyedUnarchiver unarchiveObjectWithData:myData];

我认为应该这样做。

【讨论】:

  • 嗨 Josh,我已经实现了 NSCoding,但仍然无法将对象保存在字典中。正如迈克所说,我检查了写入文件的结果,结果是“否”。有什么想法吗?
  • @Leo:没错,对不起; Eimantas 提到了你需要的另一半:NSKeyedArchiver。我已更新我的答案以包含该部分。
【解决方案2】:

writeToFile 方法只能将标准类型的对象存储到 plist 中。如果您有自定义对象,则必须为此使用 NSKeyedArchiver/NSKeyedUnarchiver

【讨论】:

  • 嗨 Eimantas,我已经实现了 NSKeyedArchiver 方法,现在可以保存自定义对象。我的问题是我可以像 nsdictionary 一样使用它吗?我的意思是在 NSDictionary 中内置了获取所有键的功能,因此您可以遍历。我可以枚举归档对象吗?
  • 除非您将字典与您的对象一起存档(即使用 encodeWithCoder 而不是 writeToFile),否则不会。
猜你喜欢
  • 2017-08-30
  • 2011-08-04
  • 1970-01-01
  • 1970-01-01
  • 2019-07-28
  • 2011-01-19
  • 2020-08-14
相关资源
最近更新 更多