GCD块在调用时触发EXC_BAD_ACCESS

时间:2010-11-18 05:02:23

标签: macos cocoa grand-central-dispatch macfuse

我正在制作一个非垃圾收集的MacFUSE Cocoa应用程序,我想在其中使用GCD块作为委托。但是,我的程序在调用块时崩溃,只留下EXC_BAD_ACCESS

我的程序使用了一个不再支持垃圾收集(也不是64位)和MacFUSE框架的Mac OS 10.5 SDK构建的框架。该程序构建时没有警告或错误作为32位程序。其他构建设置(例如优化级别)保留其原始值。

所以我有我的应用程序控制器,我从中创建了这个块并调用runWithContinuation:

AFSPasswordPrompt* prompt = [[AFSPasswordPrompt alloc] initWithIcon:icon];
dispatch_block_t continuation = ^{
    archive.password = prompt.password;
    [self mountFilesystem:fsController];
    [prompt performSelectorOnMainThread:@selector(release) withObject:nil waitUntilDone:NO];
};
[prompt runWithContinuation:continuation];

runWithContinuation:保留块并实例化一个笔尖。只有当用户通过按“打开”按钮解除密码提示时,才会调用该块。

-(void)runWithContinuation:(dispatch_block_t)block
{
    continuation = [block retain];
    [passwordPrompt instantiateNibWithOwner:self topLevelObjects:NULL];
    imageView.image = image;
    [window makeKeyWindow];
}

-(IBAction)open:(id)sender
{
    continuation();
    [self close];
}

-(void)close
{
    [window close];
    [continuation release];
}

我的问题是,当我点击continuation()时,我的程序触发EXC_BAD_ACCESS,最后一个堆栈帧被称为??。正下方是open:方法调用。

我真的不知道它来自哪里。 NSZombies已启用,它们不会报告任何内容。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

尝试复制块而不是保留它。一个块存在于堆栈中,直到您调用copy,然后将其复制到堆中。