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'
从这里我有两个问题:
- 我是否需要为所有 类 实施
encodeWithCoder:
和 initWithCoder:
- 假设我有很多不同的,由我定义 - 在我的内部我要保存的数组?
- 如果你看上面我的
initWithCoder:
方法,你可以看到我需要调用 [super initWithCoder:decoder]
,但是我是否还需要在那里调用 BNRDrawView 的初始化方法 initWithFrame:
?
是的,您需要在存储在数组中的所有对象中实现NSCoder
。
不,您不需要调用 initWithFrame
- initWithCoder
就足够了。
我正在处理来自 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'
从这里我有两个问题:
- 我是否需要为所有 类 实施
encodeWithCoder:
和initWithCoder:
- 假设我有很多不同的,由我定义 - 在我的内部我要保存的数组? - 如果你看上面我的
initWithCoder:
方法,你可以看到我需要调用[super initWithCoder:decoder]
,但是我是否还需要在那里调用 BNRDrawView 的初始化方法initWithFrame:
?
是的,您需要在存储在数组中的所有对象中实现
NSCoder
。不,您不需要调用
initWithFrame
-initWithCoder
就足够了。