Macos GCD块在调用时触发EXC_BAD_访问

Macos GCD块在调用时触发EXC_BAD_访问,macos,cocoa,grand-central-dispatch,macfuse,Macos,Cocoa,Grand Central Dispatch,Macfuse,我正在制作一个非垃圾收集的MacFUSE Cocoa应用程序,在其中我想使用一个GCD块作为委托。但是,我的程序在调用块的过程中崩溃,只留下一个EXC\u BAD\u访问 我的程序使用一个基于MacOS10.5SDK构建的框架,该框架不支持垃圾收集(也不支持64位)和MacFUSE框架。该程序作为32位程序生成时没有警告或错误。其他构建设置(如优化级别)保留为其原始值 因此,我有我的应用程序控制器,我从中创建这个块并调用runWithContinuation: AFSPasswordPrompt

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

我的程序使用一个基于MacOS10.5SDK构建的框架,该框架不支持垃圾收集(也不支持64位)和MacFUSE框架。该程序作为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:
保留块并实例化nib。只有当用户按“打开”按钮取消密码提示时,才会调用该块

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

我真的不知道它是从哪里来的。NSZombies已启用,并且不会报告任何内容


有什么想法吗?

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

我是否也必须保留它才能在
NSAutoreleasePool
中生存?@zneak copy与retain一样,意味着您现在拥有该对象。因此,您不需要额外的保留。有关更多信息,请参阅“要避免的模式”()。
-(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];
}