2

我在我的 Cordova 插件中遇到了访问问题:我NSFileHandle在 Cordova 调用之间“丢失”了上下文,我最终得到了EXC_BAD_ACCESSSIGABRTUnrecognized Selector sent to instance错误。在 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对象“丢失”了实际文件?

4

1 回答 1

1

恕我直言 - 一旦函数完成其工作,就会释放 logFile。您应该将代码更改为类似

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

或手动保留/释放 logFile 对象。

于 2013-07-24T10:16:27.977 回答