与ARC的块异步中的EXC_BAD_ACCESS

时间:2013-04-17 05:07:34

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

当我尝试获取全局变量或设置值的值时,我遇到了问题。 它在应用程序生命周期的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

                }

            };
        }
    }
});

但有时候会产生错误而其他时候却没有。有什么想法吗?

1 个答案:

答案 0 :(得分:4)

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

如果您说__weak“不起作用”,则表示self已在块运行时释放,因此弱引用已设置为{{1因此,它的消息什么都不做。这也是nil崩溃 - __unsafe_unretained已被解除分配的原因;如果没有self将其设置为__weak,则它是一个悬空指针。