EXEC_BAD_INSTRUCTION在performSelector

我有这个代码:

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

self.delegateself都不是nil

我在performSelector行获取EXC_BAD_INSTRUCTION

任何想法?

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

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

另一个debugging技巧是在debugging器中设置NSZombieEnabled , MallocStackLogging和guard malloc 。 然后,当你的应用程序崩溃时,在gdb控制台中input:

 (gdb) info malloc-history 0x543216 

用导致崩溃的对象的地址replace0x543216 ,您将得到一个更有用的堆栈跟踪,它应该可以帮助您找出导致问题的代码中的确切行。

有关更多详细说明,请参阅此文章。

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

要做到这一点,编辑你当前的计划是单击工具栏中的scheme的名称(例如“MyApp”),然后select“编辑计划…”。 点击左侧源列表中的“运行MyApp”项,然后select“诊断”选项卡,然后打开“启用僵尸对象”checkbox。

我有问题在Xcode 9debugging从主线外的用户界面。 我只是试图从主线程运行阻塞代码..而已经在主线程!

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

当然,如果你需要asynchronous的东西,只需将dispatch_sync改为dispatch_async即可

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