【问题标题】:EXC_BAD_ACCESS with IBACTION带有 IBACTION 的 EXC_BAD_ACCESS
【发布时间】:2011-01-05 10:14:08
【问题描述】:

我已经阅读了很多关于这个问题的信息,但我的似乎仍然有所不同。 所以据我了解,EXC_BAD_ACCESS 会出现内存管理问题。

问题是,我的似乎 (!:)) 不在那里。问题是,我简单地在 IB 中添加了一个按钮,圆角矩形,没有图像。我将它与我在课堂上定义的 IBACTION 连接起来。顺便说一下,这个方法什么都不做(!)。

无论如何,只要我点击按钮,应用程序就会崩溃,并显示“EXC_BAD_ACCESS”。

据我所知,我肯定不会过度发布任何东西。有什么问题?

有什么线索吗?

这是我的控制台日志:

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) 

这是我上栈后得到的:

#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

【问题讨论】:

  • 你能粘贴到控制台日志吗?
  • 还要注意,IBACTION 本身只不过是 IB 用于查找项目的占位符。预处理后看代码,IBACTIONs是不存在的
  • 我将控制台日志添加到问题中。 @kevin:老实说,我不确定该怎么做。
  • 在您单击按钮之前,执行按钮操作的对象很可能已经被释放。您可以尝试在其 -dealloc 及其按钮操作方法中添加一个 NSLog 调用来验证它。还为 objc_exception_throw 和 -[_NSZombie methodSignatureForSelector:] 启用断点(并启用 NSZombies)也会有所帮助。
  • @ (gdb) 提示符下,输入“返回”命令。这将显示错误之前发生的事情的堆栈跟踪。确定错误发生位置的简单第一步。

标签: iphone uibutton exc-bad-access


【解决方案1】:

正如 gammal 和其他人所指出的,这是一个内存问题。这与控制器引用超出范围有关,因此它的内存被释放。

如果你像这样启动控制器:

MyController* controller = [[MyController alloc] initWithNibName:@"MyNib" bundle:nil];
[self.view addSubview:controller.view];

如果您不使用 ARC,您会很好,因为在手动释放之前不会释放引用。所以我在升级项目以使用 ARC 时遇到了这个问题。

如果您将控制器启动为自动释放,或者使用 ARC,那么一旦控制器存在的范围结束,垃圾收集器将释放控制器,并且按钮按下事件将导致错误的内存异常。

解决这个问题的方法是让引用保持活动状态,因此在接口上声明它,或者如果它需要作为属性进行外部访问。

@interface MyParentController : UIView {
@private
    MyController* controller;
}

然后像这样添加它:

controller = [[MyController alloc] initWithNibName:@"MyNib" bundle:nil];
[self.view addSubview:controller.view];

如果您确实希望稍后收集它的内存,只需将值设置为 nil。

【讨论】:

    【解决方案2】:

    我也被这个折磨了几个小时。正如预期的那样,结果是内存问题。作为按钮目标的控制器已被释放。它是导航控制器的根控制器,其视图直接添加到窗口中。我的代码如下所示:

    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];
    }
    

    【讨论】:

    • 谢谢! initWithRootViewController 不保留根视图太疯狂了。
    • 您是在导航控制器分配后展示它吗?
    • 我在使用 ARC 时也遇到了这个问题。问题是我一直在从方法 var 实例化视图控制器。只需将其设为实例变量或属性即可。
    • 调试器显示initWithRootViewController两次保留了控制器。
    • 同上,救生员!我正在使用 ARC 看到这篇文章并意识到发生了什么后,我在添加按钮的类中添加了一个带有断点的 -(void) dealloc,我可以准确地看到调用版本的位置。
    【解决方案3】:

    我有一个想法。那件事发生在我很久以前。在 IB 中,您的 View 属性是否与您的视图相关联?

    我曾经解开这些,并且该应用程序从未启动。

    顺便说一句,更糟的是,重新开始这个项目。如果到目前为止你已经完成了 2 分钟的工作,那么这些头痛就不值得了。

    欢迎来到 iPhone 编程的世界。 您可能很快就会需要其中一个 wigsmen.com ;-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-02-24
      • 2012-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多