1

最近我在开发的应用程序中遇到了一个问题。该应用程序因 EXC_BAD_ACCESS 而崩溃。这没有意义,因为自动引用计数已打开。

在应用程序中,我有一个链接到显示 GKPeerPickerController 的 IBAction 的按钮。

-(IBAction)showPicker:(id)sender
{
picker = [[GKPeerPickerController alloc ] init];
picker.delegate = self;
picker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;

[picker show];
}

这没有任何意义,因为如果我尝试使用诸如释放之类的调用来管理内存,它会给我一个错误,说 ARC 禁用了该调用。所以据我所知,我对此无能为力。当它崩溃时,EXC_BAD_ACCESS 位于分配和初始化 GKPeerPickerController 的行上。

4

1 回答 1

1

这是否仅在您第二次尝试启动 GKPeerPicker 时发生?

EXC_BAD_ACCESS当您的应用程序尝试访问它不“拥有”的内存位置时抛出。这可能以多种不同的方式发生,即使使用 ARC,这也使得它很难诊断出崩溃。

查看这个问题,例如EXC_BAD_ACCESS (SIGSEGV) 崩溃- 使用 NSZombies 可能是跟踪正在发生的事情的一种方式。

但是,对正在发生的事情有更多的了解可能会帮助您了解此崩溃并修复它。

第一个问题是——当我们仅仅分配一个新分配的对象时,怎么可能得到 EXC_BAD_ACCESS?好吧 - 'ARC 的魔力'正在发挥作用......这个简单的赋值语句正在将一个新对象分配给一个实例变量。编译器会看到并说 - 啊...... ivar 可能已经分配了一个对象,在这种情况下我最好释放它......所以它会添加一些代码供您检查nil和释放 ivar ,在它分配新值之前。

所以 - 我发现 alloc/init 不太可能导致你的问题,更有可能是它当前存储在你的pickerivar 中......如果你创建picker一个局部变量而不是 ivar 会发生什么?

-(IBAction)showPicker:(id)sender
{
     GKPeerPickerController *localPicker = [[GKPeerPickerController alloc ] init];
     localPicker.delegate = self;
     localPicker.connectionTypesMask = GKPeerPickerConnectionTypeNearby;

     [localPicker show];
}
于 2012-08-29T05:25:46.713 回答