EXC_BAD_ACCESS与IBACTION [英] EXC_BAD_ACCESS with IBACTION

查看:103
本文介绍了EXC_BAD_ACCESS与IBACTION的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经阅读了很多关于这个问题的内容,但我似乎仍然有所不同。
所以根据我的理解,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的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆