我收到以下错误
程序接收信号:"EXC_BAD_ACCESS".
警告:check_safe_call:无法恢复当前帧警告:无法恢复以前选择的帧.
警告:无法恢复以前选择的帧.
我的应用程序是获取wifi信息
libHandle = dlopen("/System/Library/PrivateFrameworks/ MobileWiFi.framework/MobileWiFi",RTLD_LAZY);
open = dlsym(libHandle, "Apple80211Open");
bind = dlsym(libHandle, "Apple80211BindToInterface");
close = dlsym(libHandle, "Apple80211Close");
scan = dlsym(libHandle, "Apple80211Scan");
open(&airportHandle);
bind(airportHandle, @"en0");
Run Code Online (Sandbox Code Playgroud)
当代码到达时open(&airportHandle)
,我收到错误,但我不确定,因为在此行停止.
我该如何解决这个问题?
对于任何EXC_BAD_ACCESS错误,您通常会尝试向已发布的对象发送消息.跟踪这些问题的最佳方法是使用NSZombieEnabled.
这实际上是从不实际释放一个对象,而是通过将其包装为"僵尸"并在其中设置一个标志,表示它通常会被释放.这样,如果你再次尝试访问它,它仍然知道在你犯错之前它是什么,并且通过这些信息,你通常可以回溯看看问题是什么.
当调试器有时会破解任何有用的信息时,它特别有助于后台线程.
但是,非常重要的是,您需要100%确保这仅在您的调试代码中,而不是您的分发代码.因为什么都没有发布,你的应用程序将泄漏,泄漏和泄漏.为了提醒我这样做,我把这个日志放在我的appdelegate中:
if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled"))
NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!");
Run Code Online (Sandbox Code Playgroud)
如果您需要帮助查找确切的行,请执行构建和调试(CMD-Y)而不是构建并运行(CMD-R).当应用程序崩溃时,调试器会向您显示确切的行,并与NSZombieEnabled结合使用,您应该能够确切地找到原因.