2010-08-07 5 views
1

Я использовал следующий пример:NSKeyedUnarchiver не вызывает initWithCoder

game state singleton cocos2d, initWithEncoder always returns null

Вместо того, чтобы использовать файл, я использую объект NSData я получаю от NSUserDefaults. Он не является нулевым, а скорее имеет в нем данные, которые, я считаю, являются правильно закодированными данными, и по какой-то причине, когда я запускаю unarchiveObjectWithData, он не вызывает initWithCoder, поскольку я помещал NSLog в первую строку.

Идеи?

+ (void)loadState { 
@synchronized([AppStateManager class]) { 
    if (!sharedAppStateManager) { 
    [AppStateManager sharedManager]; 
    } 

    NSUserDefaults *udefs = [NSUserDefaults standardUserDefaults]; 
    NSData *archivedData = [udefs objectForKey:@"AppState"]; 
    NSLog(@"going to unarchive"); 
    [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; 
    NSLog(@"unarchive complete"); 
} 
} 

- (id)initWithCoder:(NSCoder *)decoder { 
NSLog(@"init coder"); 
self = [super init]; 
if (self != nil) { 
    [self setUsername:[decoder decodeObjectWithKey:@"username"]]; 
} 

return self; 
} 
+0

Создает ли исключающее исключение unarchiver? Если нет, возвращает ли он объект? Если он возвращает объект, какой класс он? –

ответ

2

Решено.

Пример, размещенный по ссылке выше, инициализирует объект через «sharedInstance» с использованием метода allocWithZone. Если объект существует, он возвращает nil.

NSKeyedUnarchiver пытается передать AGAIN через allocWithZone, и поскольку объект уже был инициализирован ранее тем же самым методом, или иногда перед его обработкой, unarchiver получает нуль вместо выделенного объекта.

Надеюсь, это поможет кому-то.

+0

Это, наверное, моя проблема, поэтому спасибо.Будет придерживаться кодирования и декодирования. – SpacyRicochet

0

Это не столько ответ, сколько дополнительная информация, которую я нашел, пытаясь работать с подобной проблемой. Я думаю, что я все еще под новичком, так что это единственный способ найти вклад в этот пост.

... В любом случае спасибо за ударяя по этому вопросу ... особенно над здесь: http://www.cocos2d-iphone.org/forum/topic/11327

У меня была проблема с изменяемым массивом рабочего с использованием метода вы работали, где это было бы переключитесь на неизменяемый массив после того, как я удалил его из файла.

Выполнение возвращенного массива как изменчивой версии тоже не сработало. Я в конечном итоге добавляю объекты FromArray к моему изменяемому массиву, и это решило мои проблемы.

Работал:

[self.mutableArray addObjectsFromArray:[decoder decodeObjectForKey:@"MutableArray"]]; 

Ни один из них работал:

self.mutableArray = [decoder decodeObjectForKey:@"MutableArray"]; 

self.mutableArray = (NSMutableArray *)[decoder decodeObjectForKey:@"MutableArray"]; 
+0

a сторону: fyi (поскольку вы упомянули о том, что являетесь новичком) приведение к 'NSMutableArray' не изменит код, который будет выполнен, он будет влиять только на предупреждения любого типа, которые может выдавать компилятор. – bshirley

2

Я не знаю, почему, но после того, как я делаю это, чтобы получить мои NSData архива (содержание которого я думаю, является несущественным):

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; 
NSData *encodedConfig = [userDefaults valueForKey:kConfiguration]; 

Когда я выполняю это, он возвращает nil.

NSArray *configs = [NSKeyedUnarchiver unarchiveObjectWithData:encodedConfig]; 

Но когда я выполняю это, я получаю ожидаемый, ранее архивированный массив объектов.

NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:encodedConfig]; 
NSArray *configs = [unarchiver decodeObject]; 

Я ожидаю идентичного поведения этих двух подходов. Мой единственный ответ - избегать unarchiveObjectWithData:.

+0

Вы правы сэр, есть определенная проблема с unarchiveObjectWithData, возвращающим что-то, кроме нуля ... и когда я использую initForReadingWithData, он работает ... – Orbitus007

Смежные вопросы