我有这段代码:
dispatch_async(dispatch_get_main_queue(), ^(void)
{
SEL selector = @selector(callback:);
[self.delegate performSelector:selector withObject:self];
});
self.delegate
和self
都不是nil
。
我在EXC_BAD_INSTRUCTION
行收到performSelector
。
有什么想法吗?
答案 0 :(得分:3)
尝试直接使用选择器,并确保callback:
是self.delegate
的有效方法:
dispatch_async(dispatch_get_main_queue(), ^(void)
{
[self.delegate performSelector:@selector(callback:) withObject:self];
});
另一个调试技巧是在调试器中设置NSZombieEnabled,MallocStackLogging和guard malloc。然后,当您的应用程序崩溃时,请在gdb控制台中输入:
(gdb) info malloc-history 0x543216
将0x543216
替换为导致崩溃的对象的地址,您将获得更有用的堆栈跟踪,它可以帮助您查明代码中导致问题的确切行。
答案 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);
}
}
`