【问题标题】:Custom objective-c class doesn't encode自定义objective-c类不编码
【发布时间】:2013-10-17 15:47:18
【问题描述】:

我有一个符合 NSCoding 协议的自定义类,但在我调用 write to file 时仍然拒绝编码。

@implementation PXLevel

- (id)initWithName:(NSString *)name andArray:(NSMutableArray *)map {
    self = [super init];
    self.name = name;
    self.map = map;
    return self;
}

- (id)initWithName:(NSString *)name {
    self = [super init];
    self.name = name;

    NSMutableArray *tempArray = [[NSMutableArray alloc] init];
    for (int i = 0; i < 8; i++) {
        NSMutableArray *line = [[NSMutableArray alloc] init];
        for (int j = 0; j < 8; j++) {
            [line addObject:@"grass"];
        }
        [tempArray addObject:line];
    }
    self.map = tempArray;
    return self;
}

-(void) encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:self.name forKey:@"levelName"];
    [aCoder encodeObject:self.map forKey:@"levelMap"];
}

-(id) initWithCoder:(NSCoder *)aDecoder
{
    if((self = [super init]))
    {
        self.name = [aDecoder decodeObjectForKey:@"levelName"];
        self.map = [[aDecoder decodeObjectForKey:@"levelMap"] mutableCopy];

    }

    return self;
}

如您所见,变量 map 是一个包含字符串的多维数组。不知道这是搞砸了还是什么。

顺便说一句我的界面

@interface PXLevel : NSObject <NSCoding>

@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) NSMutableArray *map;

- (id)initWithName:(NSString *)name andArray:(NSMutableArray *)map;
- (id)initWithName:(NSString *)name;

【问题讨论】:

  • 你在什么对象上调用writeToFile:?它与您的PXLevel 课程有何关系?
  • 具体来说,一个可变的 PXLevel 对象数组(上面的实现)。我检查了代码,该方法可以将一个空数组保存到一个新的 plist,但添加一个 PXLevel 并没有任何反应。

标签: objective-c serialization encoding nscoding


【解决方案1】:

假设您尝试使用 writeToFile:atomically: 写入文件

NSCoding 创建一个序列化的存档,它不能与writeToFile:atomically: 一起使用。您需要使用 NSKeyedArchiver,如下所示:

[NSKeyedArchiver archiveRootObject:levelObject toFile:@"path/level-object.txt"];

【讨论】:

  • 这个方法一定要存档到txt文件吗?此外,这是否只能存档自定义对象,因为我尝试使用 PXLevel 对象的可变数组进行此操作,但返回的数据不太正确。
  • 哎呀!忘记走两边了。将我的加载方法更改为 unarchiveObjectWithFile,现在它可以工作了!非常感谢您的帮助!
  • 不客气。顺便说一句,.txt 只是一个扩展名,您可以根据需要使用 .archive 或自定义扩展名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2011-08-16
  • 1970-01-01
  • 1970-01-01
  • 2012-09-16
相关资源
最近更新 更多