#ios #objective-c #cocoa-touch
#iOS #objective-c #cocoa-touch
Вопрос:
(id)decodeObjectForKey:(NSString *)key fromFile:(NSString *)fileName
{
NSData* data = [[NSData alloc] initWithContentsOfFile:[self dataFilePath:fileName]];
NSKeyedUnarchiver* unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];
id object = [unarchiver decodeObjectForKey:key];
[unarchiver finishDecoding];
[data release];
#warning some trouble here!!
[unarchiver release];
return object;
}
это функция в моем app_delegate, но когда я вызываю ее, программа выходит из строя и выдает такое примечание:
-[CFString release]: message sent to deallocated instance 0x4e63a60
Я не знаю, куда я отправил выпуск в CFString?
PS: функция dataFilePath:
(NSString*)dataFilePath:(NSString*) appdix
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
return [documentsDirectory stringByAppendingPathComponent:appdix];
}
Комментарии:
1. Если вы создаете с помощью ARC, вы можете не беспокоиться о большинстве этих проблем
Ответ №1:
decodeObjectForKey возвращает автоматически выпущенный объект. Я думаю, вам следует сохранить этот объект и выпустить его позже после вашего использования..
В вашей функции decodeObjectForKey..Здесь нет изменений..
//no change here..
id object = [unarchiver decodeObjectForKey:key];
...
return object;
Теперь, когда вы используете вашу функцию decodeObjectKey, сохраняйте значение, которое она возвращает
id returnedObject = [[yourAppDelegate decodeObjectForKey:@"yourKey" fromFile:@"yourFile"]retain];
//do whatever you need with this variable..
......
...
//after your usage..
[returnedObject release];
Надеюсь, это поможет..
Комментарии:
1. что такое [выпуск returnObject]? должно ли это быть возвращением [авторелиз объекта]?
2. нет .. мы можем напрямую освободить это, так как теперь оно принадлежит нам (путем сохранения), и нам больше не нужна эта переменная.. Также обратите внимание, что returnObject — это имя переменной, которое я дал.. Я не думаю, что вы правильно прочитали мой ответ.. Хорошо, я отредактирую имя переменной..
3. Я понял, извините за мое непонимание.