[выпуск CFString] вызывает сбой при выпуске NSKeyedUnarchiver

#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. Я понял, извините за мое непонимание.