我正在制作一个非垃圾收集的 MacFUSE Cocoa 应用程序,我想在其中使用 GCD 块作为委托。但是,我的程序在调用块期间崩溃,只留下一个EXC_BAD_ACCESS
。
我的程序使用了一个基于 Mac OS 10.5 SDK 构建的框架,它不支持垃圾收集(也不支持 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:
保留块并实例化一个笔尖。只有当用户按下“打开”按钮关闭密码提示时,才会调用该块。
-(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 已启用,它们不会报告任何内容。
有任何想法吗?