我正在研究来自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:
?答案 0 :(得分:2)
是的,您需要在存储在数组中的所有对象中实现NSCoder
。
不,您不需要致电initWithFrame
- initWithCoder
即可。