Сбой NSCFArray objectForKey?
-
20-12-2019 - |
Вопрос
Я пытаюсь сделать что-то относительно простое.У меня есть .plist в моем пакете, и я пытаюсь сохранить его в каталоге documents с шифрованием.Теперь, прежде чем я попробовал добавить шифрование, оно работало нормально.Однако возникла новая авария.
Вот как я сохраняю свой файл .plist:
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Hi.plist"];
NSFileManager *fileManager = [NSFileManager defaultManager];
if (![fileManager fileExistsAtPath: path]) {
NSString *bundle = [[NSBundle mainBundle] pathForResource:@"GameSave" ofType:@"plist"];
NSData *plistData = [NSData dataWithContentsOfFile:bundle];
[NSKeyedArchiver archiveRootObject:plistData toFile:path];
plistData = [plistData AES256EncryptWithKey:@"536335"];
[plistData writeToFile:path atomically:YES];
}
Затем вот как я извлекаю свой .plist (а позже изменяю значение и повторно сохраняю)
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Hi.plist"];
//Get array and then current level dict
NSData *plistData = [[NSData alloc] initWithContentsOfFile:path];
plistData = [plistData AES256DecryptWithKey:@"1111"];
NSMutableArray *savegameArray = [[NSKeyedUnarchiver unarchiveObjectWithData:plistData] mutableCopy];
int objectIndex = [Singleton sharedInstance].levelNumber - 1;
NSMutableDictionary *levelDict = [[savegameArray objectAtIndex:objectIndex] mutableCopy];
[levelDict setObject:videoID forKey:@"RecordingURL"];
//Now put new dict back in array
[savegameArray replaceObjectAtIndex:objectIndex withObject:levelDict];
NSData *savedarrayData = [NSKeyedArchiver archivedDataWithRootObject:savegameArray];
savedarrayData = [savedarrayData AES256EncryptWithKey:@"1111"];
[savedarrayData writeToFile:path atomically:YES];
Однако в прочитанном коде каждый раз, когда я добираюсь до этой строки: NSMutableArray *savegameArray = [[NSKeyedUnarchiver unarchiveObjectWithData:plistData] mutableCopy];
Происходит сбой SIGABRT, который выводит:
'-[__NSCFArray objectForKey объекта:]:нераспознанный селектор, отправленный в экземпляр 0x16604140'
Что я делаю не так?
Решение
Как мы выяснили из нашего чата, нам пришлось сначала преобразовать расшифрованные NSData
возражать против надлежащего NSPropertyListSerialization
сериализация.
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"Hi.plist"];
NSData *plistData = [[NSData alloc] initWithContentsOfFile:path];
NSData *newData = [plistData AES256DecryptWithKey:@"1111"];
NSPropertyListFormat format;
NSMutableArray *savegameArray = [[NSPropertyListSerialization propertyListFromData:newData mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:nil]mutableCopy];
NSLog(@"Array: %@",savegameArray);
Другие советы
Вам просто нужно выделить память к вашему nsmutablearray, как ... Nsmutablearray * arrayname= [[nsmutablearray alloc] init]; Пока вы не сделаете этот сбой ..
Надеюсь, это полезно.
Спасибо, Раджеш ..