EXEC_BAD_INSTRUCTION在performSelector
我有这个代码:
dispatch_async(dispatch_get_main_queue(), ^(void) { SEL selector = @selector(callback:); [self.delegate performSelector:selector withObject:self]; });
self.delegate
和self
都不是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); } } `