EXC_BAD_ACCESS(code = 1,address = 0x0)whenModalForWindow
我有一个窗口和一个窗口控制器,当用户点击一个按钮时打开。 有时我得到EXC_BAD_ACCESS(代码= 1,地址= 0x0)。EXC_BAD_ACCESS(code = 1,address = 0x0)whenModalForWindow
0x7fff6f2a59e0: movq (%rax), %rdi
下面是代码:
ChooseProceduresWindowController *chooseProceduresWindowController = [[ChooseProceduresWindowController alloc] initWithWindowNibName:@"ChooseProceduresWindow"];
[NSApp runModalForWindow:[chooseProceduresWindowController window]];
然后出现错误runModalForWindow:被调用。 我不会每次都遇到这个错误,但是我找不到模式。
谢谢
当对象不存在于内存中时,将引发该错误。我开始寻找内存管理问题。首先要确保在使用它之后释放ChooseProceduresWindowController。
当我尝试以模式打开它时,我在释放之前发现错误。 –
你是否多次打开它并在第一次尝试中出错? –
是的,我多次打开它,不,我没有在第一次尝试时出错。 –
调试EXC_BAD_ACCESS
错误的最佳方法是使用NSZombies
。
看看这个视频说明:
NSZombie
在内存中保存所有的对象,当你试图释放一个已经被释放的对象,所以你得到更接近于找到你的bug 。正如@Mark H所说,这是一个内存管理问题。
此外,您可以将NSLog
放在您的dealloc方法中,以更好地了解在运行时将取消分配的内容。
有时处于释放中间的对象抛出“不响应选择器”异常。有时EXC_BAD_ACCESS是由于阅读数组边界之外的数据(seg fault),如果我没有错的话......但是'NSZombies'是一个很好的开始。 –
这两个窗口是否保证在模式操作的整个持续时间内拥有('strong')? ARC无意提前发布的异常通常是“EXC_BAD_ACCESS”异常的原因,特别是在0x0处。 – Ephemera