NSOpenPanel在选择文件时崩溃

时间:2011-11-02 16:38:58

标签: xcode recursion webkit crash nsopenpanel

我正在使用NSOpenPanel来允许用户从他们的MAC中选择一个文件。该面板打开正常并过滤掉正确的文件,但是一旦我点击文件,我的应用程序就会崩溃。

以下是打开面板的代码:

if ([openDlg runModalForDirectory:begin file:filename types:filetypes] == NSOKButton)
{
    NSArray* selected = [openDlg filenames];
    for (int i = 0; i < (int)[selected count]; i++)
    {
        NSString* fileName = [selected objectAtIndex:i];
        string fn = [fileName UTF8String];
        results->Append(Value::NewString(fn));
    }
}

代码永远不会从runmodalForDirectory方法调用返回。

因此,一旦我选择了一个文件,调试器控制台会这样说:

Program received signal:  “EXC_BAD_ACCESS”.
warning: Unable to restore previously selected frame.
Data Formatters temporarily unavailable, will re-try after a 'continue'. (Not safe to call dlopen at this time.)

简单地说,我认为此时打电话给dlOpen是不安全的。

然后我明白了:

Loading a lot of stack frames

并且调用堆栈如下所示:

Call Stack

在递归调用发生之前调用堆栈:

enter image description here

调用堆栈位于名为WebFullScreenController.mm的WebKit框架文件中,递归调用此方法setDisableActions:

@implementation CATransaction(SnowLeopardConvenienceFunctions)
+ (void)setDisableActions:(BOOL)flag
{
    [self setValue:[NSNumber numberWithBool:flag] forKey:kCATransactionDisableActions];
}

有没有人知道为什么会这样?提前谢谢。

1 个答案:

答案 0 :(得分:0)

我找到了答案,我们可能会删除这个问题,原来这是我正在使用的webkit版本,而且我必须根据webkit.org上发布的这个错误修复来修改webkit

https://bugs.webkit.org/show_bug.cgi?id=61224