Objective c 应用程序在调度队列时阻塞

Objective c 应用程序在调度队列时阻塞,objective-c,grand-central-dispatch,xmppframework,Objective C,Grand Central Dispatch,Xmppframework,Im使用XMPPFramework,其代码中有如下方法: - (NSDictionary *)occupants { if (dispatch_get_current_queue() == moduleQueue) { return occupants; } else { __block NSDictionary *result; dispatch_sync(moduleQueue, ^{//IT BLOC

Im使用XMPPFramework,其代码中有如下方法:

- (NSDictionary *)occupants
{
    if (dispatch_get_current_queue() == moduleQueue)
    {
        return occupants;
    }
    else
    {
        __block NSDictionary *result;

        dispatch_sync(moduleQueue, ^{//IT BLOCKS HERE, WITHOUT MESSAGE
            result = [occupants copy];
        });

        return [result autorelease];
    }
}
[编辑] 它会前后不一致地阻塞,但并不总是如此,因为应用程序没有做任何事情。我暂停它,我看到线程已停止在那里,并且它从未继续执行。 怎么了?有什么想法吗


感谢

块有时需要保留变量,以确保它们在执行时可用。如果在块内使用局部变量,则应在块外声明时将其初始化为零。

您解释的行为与在主线程上尝试通过GCD在主线程上发送执行操作时出现的行为完全匹配。所以您应该检查moduleQueue是否是主队列,然后就是它。尝试检查它是否是主队列(如果是),跳过调度同步块。

尝试启用僵尸对象:您如何知道它在那里崩溃?显示确切的错误/崩溃消息和回溯。依赖IVAR的函数应该使用断言,您是否尝试过
NSParameterAssert(moduleQueue)?好的,它没有真正崩溃,对不起,我会编辑我的帖子…好吧,即使moduleQueue不是主队列,如果代码是从主线程调用的,应用程序将冻结,直到在后台线程上完成工作。如果另一个线程与moduleQueue上运行的块内的主线程/队列同步,则可能是死锁。如果当前队列是该方法将调度到的队列,则代码不会调用
dispatch\u sync
。更可能的是,
moduleQueue
不是主队列(或者它是主队列,但调用是从其他队列发出的);队列真的很忙,或者阻塞了其他内容。块不会隐式保留用
\uu block
声明的变量值。此外,如果提问者正在使用ARC,则变量已隐式初始化为
nil