首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >GCD / NSOperationQueue EXC_BAD_ACCESS

GCD / NSOperationQueue EXC_BAD_ACCESS
EN

Stack Overflow用户
提问于 2014-11-24 16:50:31
回答 1查看 759关注 0票数 1

我使用GCD / NSOperationQueue进行异步删除。

我实现了以下代码:

代码语言:javascript
代码运行次数:0
运行
复制
- (void)deleteWithCompletionHandler:(Handler)completionHandler
{
NSOperationQueue *queue = [[NSOperationQueue alloc] init];

[queue addOperationWithBlock:^{

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSError *error;

    if ([fileManager fileExistsAtPath:self.path]) {

        BOOL success = [fileManager removeItemAtPath:self.path error:&error];

    }

    NSOperationQueue *main = [NSOperationQueue mainQueue];

    [[NSOperationQueue mainQueue] addOperationWithBlock:^{

        if (completionHandler) {

            completionHandler(error, nil);
        }
    }];
}];
}

以及以下各点:

代码语言:javascript
代码运行次数:0
运行
复制
- (void)deleteWithCompletionHandler:(Handler)completionHandler
{
dispatch_queue_t queue = dispatch_queue_create("My Queue", NULL);

dispatch_async(queue, ^{

    NSFileManager *fileManager = [NSFileManager defaultManager];

    NSError *error;

    if ([fileManager fileExistsAtPath:self.path]) {

        BOOL success = [fileManager removeItemAtPath:self.path error:&error];

    }


    dispatch_async(dispatch_get_main_queue(), ^{

        if (completionHandler) {

            completionHandler(error, nil);
        }
    });
});
}

这两个代码段在返回主线程时都会导致EXC_BAD_ACCESS。

我做错什么了?项目中的某些代码不使用ARC。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-24 20:17:57

由于您没有使用ARC,所以您的堆栈变量不会初始化为0/nil。因此,completionHandler(error, nil);将与error的随机堆栈垃圾一起调用。

在查看代码时,这是一个突出的问题,clang静态分析器应该很容易捕捉到这个问题。我建议您在代码上运行分析器,并查看所有警告。

可能还有其他的问题潜伏着,所以如果你需要更多的帮助,请提供你的坠机报告。

另外,队列变量超出了作用域,所以要么泄漏它(在MRR情况下),要么在仍然使用时释放它(在ARC情况下)。您可能应该只使用一个全局并发队列。

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

https://stackoverflow.com/questions/27109893

复制
相关文章

相似问题

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