performSelector上的EXC_BAD_INSTRUCTION

时间:2011-10-18 23:48:12

标签: ios xcode

我有这段代码:

dispatch_async(dispatch_get_main_queue(), ^(void) 
{ 
    SEL selector = @selector(callback:);
    [self.delegate performSelector:selector withObject:self];
});

self.delegateself都不是nil

我在EXC_BAD_INSTRUCTION行收到performSelector

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

尝试直接使用选择器,并确保callback:self.delegate的有效方法:

dispatch_async(dispatch_get_main_queue(), ^(void) 
{ 
    [self.delegate performSelector:@selector(callback:) withObject:self];
});

另一个调试技巧是在调试器中设置NSZombieEnabledMallocStackLoggingguard malloc。然后,当您的应用程序崩溃时,请在gdb控制台中输入:

(gdb) info malloc-history 0x543216

0x543216替换为导致崩溃的对象的地址,您将获得更有用的堆栈跟踪,它可以帮助您查明代码中导致问题的确切行。

See this article for more detailed instructions.

答案 1 :(得分:0)

self.delegate可能已被取消分配。如果您自己清除指针,指针将只是nil,或者它是ARC下的weak引用。尝试打开“启用僵尸对象”选项运行。

要执行此操作,请编辑当前方案,方法是单击工具栏中的方案名称(例如“MyApp”),然后选择“编辑方案...”。单击左侧源列表中的“运行MyApp”项,然后选择“诊断”选项卡,并打开“启用僵尸对象”复选框。

答案 2 :(得分:0)

我在Xcode 9中调试了从主线程外部调用UI的问题。我只是试图从主线程中运行阻塞代码..已经在主线程上了!

解决方法是使用这个方法(当然声明为__block)我需要从主线程修改的所有变量(在我的情况下只是获得UIView宽度)。

当然,如果您需要异步,只需将dispatch_sync更改为dispatch_async

即可
`
+ (void)runOnMainSafelyBlocking:(void(^)(void))block;
{
    if ([NSThread isMainThread])
    {
        block();
    }
    else
    {
        dispatch_sync(dispatch_get_main_queue(), block);
    }
}
`