EXC_BAD_ACCESS in block async with ARC



嗨,我有一个问题,当我试图获得一个全局变量或设置值的值。代码是在应用程序生命周期的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
                }
            };
        }
    }
});

但有时会产生错误,而有时则不会。任何想法?

停止使用此weakSelf。这是不必要的。self不保留这个块。没有保留循环

当你说__weak"不工作"时,这表明self在块运行时已经被释放了,所以弱引用已经设置为nil,因此给它的消息不做任何事情。这也是__unsafe_unretained崩溃的原因——self已经被释放了;如果没有__weak设置为nil,则为悬空指针

最新更新