NSKeyedUnarchiver не вызывает -initWithCoder: на устройстве (но нормально на симуляторе) - PullRequest
0 голосов
/ 03 ноября 2011

Я кодирую свой объект и сохраняю его в файл следующим образом:
[NSKeyedArchiver archiveRootObject:self.parent toFile:@"gameScene.plist"];

и расшифровываем его следующим образом:
scene = [[NSKeyedUnarchiver unarchiveObjectWithFile:@"gameScene.plist"] retain];

В симуляторе вышеприведенный код декодирования правильно вызывает метод initWithCoder моего класса. Но когда я запускаю то же самое на устройстве, возвращается метод 'initWithCoder is not called nor the init` и объект' nil '.

Может кто-нибудь объяснить, что здесь не так?

РЕДАКТИРОВАТЬ: Для целей тестирования я дал один и тот же набор операторов в init и initWithCoder вместо декодирования подобъектов в initWithCoder и прокомментировал всю кодировку в моем encodeWithCoder.

1 Ответ

2 голосов
/ 03 ноября 2011

Может быть, потому что вы не можете записать в корневой каталог на устройстве iOS? Я думаю, что путь @"gameScene.plist" действительно означает /gameScene.plist, который не доступен для записи на устройстве iOS, но будет разрешен в OS X. Метод -archiveRootObject:toFile:, вероятно, возвращает здесь NO, указывая, что файл был не создан успешно.

Вы можете сделать что-то похожее на это:

NSURL *documentsURL = (NSURL *) [[[NSFileManager defaultManager] URLsForDirectory: NSDocumentDirectory inDomains: NSUserDomainMask] lastObject];
NSString *filePath = [[documentsURL path] stringByAppendingPathComponent: @"gameScene.plist"];

BOOL success = [NSKeyedArchiver archiveRootObject: self.parent toFile: filePath];
NSLog(@"Archive Success... %s", (success) ? "YES" : "NO");

NSLog(@"File Exists... %s", [[NSFileManager defaultManager] fileExistsAtPath: filePath] ? "YES" : "NO");

id unarchivedObject = [[NSKeyedUnarchiver unarchiveObjectWithFile: filePath] retain];
NSLog(@"Unarchive Success... %s", (unarchivedObject != nil) ? "YES" : "NO");
NSLog(@"Equal Objects... %s", [self.parent isEqual: unarchivedObject] ? "YES" : "NO");
...