【问题标题】:Bad Access Crash When Declaring Blocks Inline of Method Calls声明块内联方法调用时出现错误访问崩溃
【发布时间】:2012-09-25 00:10:24
【问题描述】:

我们正在处理一些调用枚举方法的代码:

- (void)enumerateRangesOfString:(NSString*)string usingBlock:(void (^)(const NSRange range, volatile BOOL * const stop))block;

这一切都很好,直到我们切换到 ARC。

当我们查看调用它的代码时,如果我们唯一声明了该块,应用程序就会停止崩溃:

id block = ^(const NSRange range, volatile BOOL * const stop) {
                [solutions_ addObject:object];
            };

[[puzzle_ stringForSolution:solution enumerateRangesOfString:word usingBlock:block];

当块在方法调用中被声明时,应用程序崩溃了。我们(我)真的不知道为什么这会解决问题,但我同意了,因为我不想一直用头撞墙。

问题是,在调用方法时,每个块的内联声明似乎都是如此。在我将 AFNetworking 库添加到应用程序后,我的应用程序不断崩溃。问题是我真的不想修改这个库的所有代码,我假设我的代码有问题。当我将块声明为内联时,此问题继续导致崩溃,而不是当我将块拉出并单独声明时。

我在其他几个应用程序中使用 AFNetworking。显然我们都知道块应该可以声明为内联。这使我得出结论,错误不在方法的调用中,而是在这个项目的某个地方崩溃了。

【问题讨论】:

  • 你能显示崩溃代码吗?

标签: ios automatic-ref-counting objective-c-blocks xcode4.5


【解决方案1】:

我很确定您的问题的根本原因是当该方法返回时您的块参数确实超出了范围。我的理解是,采用块参数的 Apple 类会立即将 block_copy() 转换为 ivar(即 block foo = block_copy(parameter))。

【讨论】:

    猜你喜欢
    • 2013-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-04
    • 2013-04-23
    • 1970-01-01
    • 2013-11-07
    • 1970-01-01
    相关资源
    最近更新 更多