【问题标题】:NSKeyedArchiver archivedDataWithRootObject:NSKeyedArchiver archivedDataWithRootObject:
【发布时间】:2011-04-14 08:03:22
【问题描述】:

NSKeyedArchiver 的参数是archivedDataWithRootObject: 应该是我要保存的数组,还是转换成NSData 的数组?

【问题讨论】:

    标签: objective-c cocoa-touch nsmutablearray nsdata nskeyedarchiver


    【解决方案1】:

    裕二的回答是对的。但更准确地说,您的数组元素必须实现协议并将您自己的代码填充到方法 initWithCoder: 和 encodeWithCoder: 喜欢:

    - (id)initWithCoder:(NSCoder *)decoder {
        if (self = [super init]) {
            self.title = [decoder decodeObjectForKey:@"title"];
            self.author = [decoder decodeObjectForKey:@"author"];
            self.published = [decoder decodeBoolForKey:@"published"];
        }
        return self;
    }
    - (void)encodeWithCoder:(NSCoder *)encoder {
        [encoder encodeObject:title forKey:@"time"];
        [encoder encodeObject:author forKey:@"author"];
        [encoder encodeBool:published forKey:@"published"];
    }
    

    然后您可以使用归档器和取消器,例如:

    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:notes];
    [[NSUserDefaults standardUserDefaults] setObject:data forKey:@"notes"];
    
    NSData *notesData = [[NSUserDefaults standardUserDefaults] objectForKey:@"notes"];
    NSArray *notes = [NSKeyedUnarchiver unarchiveObjectWithData:notesData];
    

    更多内容,请参考“Archiving Objective-C Objects with NSCoding”。

    【讨论】:

      【解决方案2】:

      要将通用数组转换为NSData,您需要一个存档器!如果你知道如何喂NSData,你就会知道如何使用NSKeyedArchiver。所以:

      NSArray* array= ... ;
      NSData* data=[NSKeyedArchiver archivedDataWithRootObject:array];
      

      当然,array 中的所有元素都需要实现 encodeWithCoder:

      【讨论】:

      • 为了完整起见,您使用 NSKeyedUnarchiver 进行反向操作。
      • "你数组中的所有元素都需要实现encodeWithCoder:"
      • 数组中的所有元素都需要由 Apple 或您实现 encodeWithCoder:。您可以通过查看官方文档来检查 Apple 提供的对象是否实现了它……看看它是否实现了协议 NSCoder
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-24
      • 1970-01-01
      相关资源
      最近更新 更多