【问题标题】:EXC_BAD_ACCESS in block async with ARC [closed]EXC_BAD_ACCESS 在与 ARC 的块异步中 [关闭]
【发布时间】:2013-04-17 05:07:34
【问题描述】:

您好,我在尝试获取全局变量或设置值时遇到问题。 它在应用程序生命周期的applicationDidEnterBackground 方法中的代码,当我需要实时知道调用状态但有时这会生成 EXC_BAD_ACCESS

这是变量声明 @property(nonatomic, copy) NSNumber *calling;,在我的 .h 文件中。

这是我的 .m 实现文件的代码:

__unsafe_unretained typeof(self) weakSelf = self;

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

    @autoreleasepool
    {
        while (weakSelf.calling.intValue == 1)
        {
            callCenter.callEventHandler = ^(CTCall* call)
            {
                if([call.callState isEqualToString:CTCallStateDisconnected])
                {
                   weakSelf.calling = [[NSNumber numberWithInt:0] copy];//Error EXC_BAD_ACCESS

                }

            };
        }
    }
});

但有时会产生错误,有时不会。有什么想法吗?

【问题讨论】:

  • __unsafe_unretained 替换为__weak。当引用的对象被释放时,弱变量将自动设置为nil
  • 另外,你为什么在不可变的NSNumber 对象上调用copy
  • 我使用了 __weak 但这不起作用,我删除了 NSNumber 的副本但它不起作用,:(

标签: ios objective-c objective-c-blocks


【解决方案1】:

停止使用此weakSelf。这不是必要的。 self 不保留此块。没有保留周期。

当你说__weak“不起作用”时,这表明self在块运行时已经被释放,因此弱引用已设置为nil,因此向它什么也不做。这也是__unsafe_unretained 崩溃的原因——self 已经被释放;如果没有__weak 将其设置为nil,它是一个悬空指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多