我已经阅读了很多关于这个问题的内容,但我似乎仍然有所不同。
所以根据我的理解,EXC_BAD_ACCESS会出现内存管理问题。
事情是,我的似乎不是(!:))。问题是,我简单地在IB中添加了一个按钮,圆角矩形,没有图像。我用我在课堂上定义的IBACTION将它连接起来。顺便说一下,这个方法什么都不做(!)。
无论如何,只要我点击按钮,应用程序就会崩溃,并显示EXC_BAD_ACCESS。
就我所知,我肯定不会过度发布任何东西。有什么问题?
任何线索?
这是我的控制台日志:
将程序加载到调试器中...
sharedlibrary apply-load-rules all
程序已加载。
target remote-mobile /tmp/.XcodeGDBRemote-148-79
切换到remote-macosx协议
mem 0x1000 0x3fffffff cache
mem 0x40000000 0xffffffff none
mem 0x00000000 0x0fff none
run
Running ...
[切换到线程11779]
[切换到线程11779]
(gdb)继续
2010-01-15 09 :16:34.800 FlightControl1 [1899:207]表装
2010-01-15 09:16:35.200 FlightControl1 [1899:207] 23
2010-01-15 09:16:35.350 FlightControl1 [1899] :207] debug
程序接收信号:EXC_BAD_ACCESS。
(gdb)
这是我得到的,在我上升后:
#0 0x31ec3ebc in objc_msgSend()
#1 0x33605784 in - [UIApplication sendAction:to:from:forEvent:] ()
#2 0x336056ec in - [UIApplication sendAction:toTarget:fromSender:forEvent:]()
#3 0x336056b4 in - [UIControl sendAction:to:forEvent:]()
#4 0x3360530c in - [UIControl(内部)_sendActionsForEvents:withEvent:]()
#5 0x33605f8c in - [UIControl touchesEnded:withEvent:]()
#6 0x335fd9ac in _UIGestureRecognizerUpdateObserver()
#7 0x9da1830 in __CFRunLoopDoObservers()
#8 0x30de9346 in CFRunLoopRunSpecific()
#9 0x30de8c1e in CFRunLoopRunInMode()
#10 0x332e7374 in GSEventRunModal()
#11 0x335adc30 in - [UIApplication _run ]()
#12 0x335ac230在UIApplicationMain()
#13 0x000027a8 in main(argc = 1,argv = 0x2ffff4d8)atUsers/SomePath/main.m:14
我也遭受了几个小时的折磨。事实证明这是一个预期的记忆问题。作为按钮目标的控制器被取消分配。它是导航控制器的根控制器,其视图直接添加到窗口中。我的代码看起来像这样:
MyController * myController = [[MyController new] autorelease];
UINavigationController * navController =
[[[UINavigationController alloc] initWithRootViewController:myController] autorelease];
[window addSubview:navController.view];
我的假设是保留 myController
当它作为 UINavigationController
的根控制器传递时,但结果证明是错误的。解决方案是将控制器分配给局部变量并在 dealloc
中释放它。包含上述代码的对象的接口应该具有:
...
@property(retain,nonatomic) MyController * myController;
...
实施:
self.myController = [[MyController new] autorelease];
UINavigationController * navController =
[[[UINavigationController alloc] initWithRootViewController:myController] autorelease];
[window addSubview:navController.view];
...
- (void)dealloc {
[self.myController release];
...
[super dealloc];
}
I have read a lot about this issue but mine still seems to be different somehow.So from what I understood, EXC_BAD_ACCESS occurs with memory management problems.
The thing is, mine does not seem (! :)) to be there. The thing is, I simple added a button in IB, rounded rect, no image. The I hooked it up with an IBACTION I defined in my class. This method does nothing (!) by the way.
Anyway, as soon as I click the button, the App crashes, with "EXC_BAD_ACCESS".
I am surely not overreleasing anything, as far as I can see, that is. What is wrong there?
Any clues?
This is my console log:
Loading program into debugger…
sharedlibrary apply-load-rules all
Program loaded.
target remote-mobile /tmp/.XcodeGDBRemote-148-79
Switching to remote-macosx protocol
mem 0x1000 0x3fffffff cache
mem 0x40000000 0xffffffff none
mem 0x00000000 0x0fff none
run
Running…
[Switching to thread 11779]
[Switching to thread 11779]
(gdb) continue
2010-01-15 09:16:34.800 FlightControl1[1899:207] Table loaded
2010-01-15 09:16:35.200 FlightControl1[1899:207] 23
2010-01-15 09:16:35.350 FlightControl1[1899:207] debug
Program received signal: "EXC_BAD_ACCESS".
(gdb)
This is what I get, after I went up the stack:
#0 0x31ec3ebc in objc_msgSend ()
#1 0x33605784 in -[UIApplication sendAction:to:from:forEvent:] ()
#2 0x336056ec in -[UIApplication sendAction:toTarget:fromSender:forEvent:] ()
#3 0x336056b4 in -[UIControl sendAction:to:forEvent:] ()
#4 0x3360530c in -[UIControl(Internal) _sendActionsForEvents:withEvent:] ()
#5 0x33605f8c in -[UIControl touchesEnded:withEvent:] ()
#6 0x335fd9ac in _UIGestureRecognizerUpdateObserver ()
#7 0x30da1830 in __CFRunLoopDoObservers ()
#8 0x30de9346 in CFRunLoopRunSpecific ()
#9 0x30de8c1e in CFRunLoopRunInMode ()
#10 0x332e7374 in GSEventRunModal ()
#11 0x335adc30 in -[UIApplication _run] ()
#12 0x335ac230 in UIApplicationMain ()
#13 0x000027a8 in main (argc=1, argv=0x2ffff4d8) at /Users/SomePath/main.m:14
解决方案 I was tortured by this for a few hours as well. It turned out to be a memory problem as expected. The controller acting as the target for the button was deallocated. It was the root controller of a navigation controller whose view was added directly to the window. My code looked like this:
MyController *myController = [[MyController new] autorelease];
UINavigationController* navController =
[[[UINavigationController alloc] initWithRootViewController:myController] autorelease];
[window addSubview:navController.view];
My assumption was that myController
would be retained when it's passed as the root controller of the UINavigationController
, but that turned out to be wrong. The solution was to assign the controller to a local variable and release it in dealloc
. The interface of the object containing the above code should have:
...
@property (retain, nonatomic) MyController *myController;
...
And the implementation:
self.myController = [[MyController new] autorelease];
UINavigationController* navController =
[[[UINavigationController alloc] initWithRootViewController:myController] autorelease];
[window addSubview:navController.view];
...
- (void)dealloc {
[self.myController release];
...
[super dealloc];
}
这篇关于EXC_BAD_ACCESS与IBACTION的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!