【问题标题】:EXC_BAD_ACCESS when using the same NSFileHandle object in a Cordova plugin在 Cordova 插件中使用相同的 NSFileHandle 对象时的 EXC_BAD_ACCESS
【发布时间】:2013-07-24 08:27:20
【问题描述】:

我在 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,然后使用cordova.exec 调用stopWriting。错误发生在stopWriting 的最后一行。有几次问题奇迹般地消失了,但在大多数情况下,我遇到了上述错误之一。
我的 logFile 对象似乎无缝关闭了文件,但根据 iOS 文档,这通常发生在 NSFileHandle 对象被释放时,而我的对象被声明为 static,并且不应该只要我的插件存在就被释放(另外,我在 XCode 调试器中看到它仍然被分配)。

在您看来,是什么导致我的 NSFileHandle 对象“丢失”了实际文件?

【问题讨论】:

  • 您的意思是说我的问题的根源是未知的吗?因为我调试了代码并且一遍又一遍地在同一行 [logFile writeData:nsData] 上失败。我确定这是有问题的行,因为stopWriting 是我按下按钮的结果。
  • 我不知道什么是真正的问题,但我只是想帮助你 :) 谢谢 :)
  • 谢谢!那么,如果我已经知道哪一行出现故障并且logFile 对象在该行中不是 nil,那么您认为我可以从您粘贴的链接中提供的 DebugConsole 中获益吗?

标签: objective-c cordova nsfilehandle


【解决方案1】:

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

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

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

【讨论】:

  • 好吧,使用这个代码 sn-p(根据你的第二个建议)帮助我解决了这个问题:if (logFile==nil) logFile = [[NSFileHandle fileHandleForWritingAtPath:@"path_to_my_file"]retain];。谢谢!!!这是否意味着 static 变量不会像封装对象一样持续存在?我的意思是 - static NSFileHandle *logFile; 这行不是意味着 logFile 即使在方法结束后也有引用?
  • 也许你想让它“强”而不是“静态”? (stackoverflow.com/questions/11013587/…)
  • 谢谢!但我想要一个 ivar,而不是一个属性,据我所知,只有属性可以定义为强。
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-16
  • 2016-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多