首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用时触发EXC_BAD_ACCESS的GCD块

调用时触发EXC_BAD_ACCESS的GCD块
EN

Stack Overflow用户
提问于 2010-11-18 13:02:23
回答 1查看 910关注 0票数 0

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

我的程序使用了一个针对MacOS10.5SDK构建的框架,该框架不支持垃圾收集(也不支持64位)和MacFUSE框架。作为32位程序,该程序构建时不会出现警告或错误。其他构建设置(如优化级别)保留为其原始值。

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

代码语言:javascript
复制
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。只有当用户按下"Open“按钮关闭密码提示时,才会调用该块。

代码语言:javascript
复制
-(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已启用,并且它们不会报告任何内容。

有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2010-11-18 13:06:06

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4211828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档