EXC_BAD_ACCESS при использовании того же объекта NSFileHandle в плагине Cordova

У меня возникла проблема с доступом в моем плагине Cordova: мой NSFileHandle "теряет" контекст между вызовами Cordova, и я получаю либо EXC_BAD_ACCESS, SIGABRT, либо < strong>Неопознанный селектор отправлен экземпляру. Отладка и копание в документации Obj-C не дали мне никаких указаний по этому поводу, поэтому я был бы очень признателен за вашу помощь здесь!

Вот мой код. Во-первых - интерфейс:

@interface MyPlugin : CDVPlugin
...
- (void) startWriting:(CDVInvokedUrlCommand*)command;
- (void) stopWriting:(CDVInvokedUrlCommand*)command;
@end  

И реализация:

....
static NSFileHandle *logFile;


@implementation MyPlugin

- (void) startWriting:(CDVInvokedUrlCommand*)command{
    logFile = [NSFileHandle fileHandleForWritingAtPath:@"path_to_my_file"];
    NSData nsData = [@"Hello World!" dataUsingEncoding:NSUTF8StringEncoding];
    [logFile writeData:nsData];
}

- (void) stopWriting:(CDVInvokedUrlCommand*)command{
    NSData nsData = [@"Goodbye World!" dataUsingEncoding:NSUTF8StringEncoding];
   [logFile writeData:nsData];   
}  

Я звоню startWriting, а затем stopWriting, используя cordova.exec. Ошибка возникает в последней строке stopWriting. Несколько раз проблема чудесным образом исчезала, но в большинстве случаев я получаю одну из вышеупомянутых ошибок.
Похоже, что мой объект logFile без проблем закрывает файл, но, согласно документации iOS, это обычно происходит, когда объект NSFileHandle освобождается, в то время как мой объект объявлен как static и не должен освобождаться, пока живет мой плагин (плюс, я вижу в отладчике XCode, что он все еще выделен).

Что, по вашему мнению, заставляет мой объект NSFileHandle «терять» настоящий файл?


person Warm Chocolate    schedule 24.07.2013    source источник


Ответы (1)


Imho - logFile освобождается, когда функция завершает свою работу. Вы должны изменить свой код на что-то вроде

if (logFile==nil) logFile = [NSFileHandle fileHandleForWritingAtPath:@"path_to_my_file"];

или вручную сохранить/освободить объект logFile.

person Anton    schedule 24.07.2013
comment
Что ж, использование этого фрагмента кода (согласно вашему второму предложению) помогло мне решить проблему: if (logFile==nil) logFile = [[NSFileHandle fileHandleForWritingAtPath:@"path_to_my_file"]retain];. Спасибо!!! Означает ли это, что статические переменные не существуют столько же, сколько существует инкапсулирующий объект? Я имею в виду - разве строка static NSFileHandle *logFile; не означает, что logFile имеет ссылку даже после завершения метода? - person Warm Chocolate; 24.07.2013
comment
Может быть, вы хотите сделать его сильным, а не статичным? ( stackoverflow.com /вопросы/11013587/ ) - person Nathan H; 24.07.2013
comment
Спасибо! Но я хочу иметь ивар, а не свойство, и, насколько я понимаю, только свойства могут быть определены как сильные. - person Warm Chocolate; 24.07.2013