最近,我在一个正在开发的应用程序中遇到了一个问题。这个应用程序在使用EXC_BAD_ACCESS时崩溃了。这没有意义,因为自动引用计数是打开的。
在应用程序中,我有一个链接到显示GKPeerPickerController的IBAction的按钮。
-(IBAction)showPicker:(id)sender
{
picker = [[GKPeerPickerController alloc ] init];
picker.delegate = self;
picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;
[picker show];
}这是没有意义的,因为如果我试图使用诸如release之类的调用来管理内存,它会给我一个错误,说明ARC禁用了该调用。据我所知,我对此无能为力。当它崩溃时,EXC_BAD_ACCESS在分配和初始化GKPeerPickerController的行上。
发布于 2012-08-29 13:25:47
这是否仅在您第二次尝试启动GKPeerPicker时发生?
当你的应用程序试图访问它不“拥有”的内存位置时,就会抛出EXC_BAD_ACCESS。这可以通过许多不同的方式发生,即使使用ARC,这使得它很难诊断崩溃。
看看这个问题,比如EXC_BAD_ACCESS (SIGSEGV) crash --使用NSZombies可能是一种跟踪正在发生的事情的方法。
然而,更多地了解正在发生的事情可能会帮助您理解这个崩溃并修复它。
第一个问题是-当我们只是分配一个新分配的对象时,如何获得EXC_BAD_ACCESS呢?嗯-‘魔术的弧线’来这里发挥作用…这个简单的赋值语句将一个新对象赋值给一个实例变量。编译器会看到这一点并说--啊...ivar可能已经分配了一个对象,在这种情况下,我最好释放它……因此,在赋值新值之前,它将为您添加一些代码来检查nil并释放ivar。
所以-我发现不太可能是alloc/init导致了你的问题,而更有可能的是它是当前存储在你的picker中的东西……如果您将picker设置为局部变量而不是ivar,会发生什么?
-(IBAction)showPicker:(id)sender
{
GKPeerPickerController *localPicker = [[GKPeerPickerController alloc ] init];
localPicker.delegate = self;
localPicker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;
[localPicker show];
}https://stackoverflow.com/questions/12171108
复制相似问题