目标C:保存项目数组(NSCoder)

时间:2015-11-04 19:56:45

标签: ios objective-c nscoder

我正在研究来自iOS Big Nerd Ranch第12章的书中的挑战,并且存在将一系列项目保存到磁盘的问题。我BNRDrawView UIView有一个数组finishedLines,其中包含由我定义的项BNRLine。我想将NSCoder用于此目的。所以,我在BNRDrawView内部实现了两种方法:

- (void) encodeWithCoder:(NSCoder *)encoder {
[encoder encodeObject:_finishedLines forKey:finishedLinesKey];
}

- (id)initWithCoder:(NSCoder *)decoder {

self = [super initWithCoder:decoder];

if (self) {
    _finishedLines = [decoder decodeObjectForKey:finishedLinesKey];
}
    return self;
}

并尝试保存finishedLines数组,只要它改变如下:

[NSKeyedArchiver archiveRootObject:self.finishedLines
                            toFile:self.finishedLinesPath];

加载我正在尝试在initWithFrame BNRDrawView方法中执行:

- (instancetype)initWithFrame:(CGRect)r
{
...
self.finishedLinesPath = @"/Users/nikitavlasenko/Desktop/XCodeProjects/MyFirstApp/TouchTracker/savedLines/finishedLines";
    BOOL fileExists = [[NSFileManager defaultManager]
                       fileExistsAtPath:self.finishedLinesPath];
    if (fileExists) {
        self.finishedLines = [NSKeyedUnarchiver
                              unarchiveObjectWithFile:self.finishedLinesPath];
    }
...

它给了我错误:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[BNRLine encodeWithCoder:]: unrecognized selector sent to instance 0x7fbd32510c40'

从这里我有两个问题:

  1. 我是否需要为所有类实现encodeWithCoder:initWithCoder: - 让我们假设我有很多不同的类,由我定义 - 在我的数组中我想保存?
  2. 如果您查看我的initWithCoder:方法的上方,您可以看到我需要调用[super initWithCoder:decoder],但是我还需要调用BNRDrawView的初始化方法initWithFrame:

1 个答案:

答案 0 :(得分:2)

  1. 是的,您需要在存储在数组中的所有对象中实现NSCoder

  2. 不,您不需要致电initWithFrame - initWithCoder即可。