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

Objective C: save array of items (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. 是的,您需要在存储在数组中的所有对象中实现NSCoder

  2. 不,您不需要调用 initWithFrame - initWithCoder 就足够了。