【问题标题】:Why do i get exc bad access in cases when object is not nil?为什么在对象不是 nil 的情况下我会得到 exc bad access?
【发布时间】:2012-09-01 03:47:04
【问题描述】:

我有一个接收远程通知的应用。推送后显示的我的视图控制器有一个表格视图。应用程序在行设置框架处非常随机地崩溃(20 次尝试中的 1 次):

if (!myTableView) {
        NSLog(@"self.myTableView is nil");
    }
    myTableView.frame=CGRectMake(0, 70, 320, 376);

只有当我打开应用程序,然后打开其他一些应用程序,然后收到推送通知时才会发生这种情况。我想这与记忆有关。我使用ARC(ios 5)。奇怪的是nslog没有显示,所以tableview不是nil。

崩溃日志:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x522d580c
Crashed Thread:  0

 Thread 0 name:  Dispatch queue: com.apple.main-thread
 Thread 0 Crashed:
 0   libobjc.A.dylib                0x352b1f7e objc_msgSend + 22
 1   Foundation                     0x37dc174c NSKVOPendingNotificationCreate + 216
 2   Foundation                     0x37dc1652 NSKeyValuePushPendingNotificationPerThread + 62
 3   Foundation                     0x37db3744 NSKeyValueWillChange + 408
 4   Foundation                     0x37d8a848 -[NSObject(NSKeyValueObserverNotification) willChangeValueForKey:] + 176
 5   Foundation                     0x37e0ca14 _NSSetPointValueAndNotify + 76
 6   UIKit                          0x312af25a -[UIScrollView(Static) _adjustContentOffsetIfNecessary] + 1890
 7   UIKit                          0x312cca54 -[UIScrollView setFrame:] + 548
 8   UIKit                          0x312cc802 -[UITableView setFrame:] + 182
 9   POViO                          0x000913cc -[FeedVC viewWillAppear:] (FeedVC.m:303)

Dealloc 没有被调用,因为它没有被记录:

- (void)dealloc {

NSLog(@"dealloc");

}

【问题讨论】:

  • 看到if (nil != myTableView)的结果会让我安心
  • 另外,请尝试按照此处所述打开僵尸:stackoverflow.com/questions/5386160/…
  • myTableView 很可能已被释放
  • 在打开僵尸时遇到问题,因为要接收推送通知,它必须使用分发配置文件运行,因此无法使用僵尸进行配置。
  • 如果您在 iOS 4 上运行并使用 ARC,应用程序可能会因为内存问题而随机崩溃。虽然 ARC 不是 OS 的选项,而是编译器的选项,但它在 iOS 4 上仍然无法正常工作。你的 iOS 版本是什么?

标签: iphone objective-c crash exc-bad-access


【解决方案1】:

我在这里找到了解决方案: Using ARC and UITableViewController is throwing Observation info was leaked, and may even become mistakenly attached to some other object

似乎拉刷新(子视图到表视图)导致问题。

【讨论】:

    【解决方案2】:

    您遇到了内存问题。您的 tableView 的保留计数为零;因此,尽管指向 tableView 的指针仍然存在,但系统已将该实际地址处的对象丢弃,因此是 EXC_BAD_ACCESS。

    显示 tableView 的 UI 可能被隐藏并因此被卸载,但你留下了一些逻辑,假设 tableView 仍然存在,而实际上它不存在。

    如果不了解更多项目,很难调试正在发生的事情。最好的办法是仔细查看应用程序和 UI 流程的设计。什么会导致 UI 被释放?您如何输入假设部分 UI 仍然存在的代码?

    注意向 nil 引用发送消息不会产生任何错误;这是语言设计的。

    【讨论】:

    • 我也尝试将tableview定义为@property (nonatomic, retain) myTableView,但结果是一样的。
    • 如果您使用 ARC,那么您不应该将 retain 作为属性声明的一部分。 “强”是要使用的词。但是,这是默认设置,所以如果你错过了强弱,它最终会变得强大。
    【解决方案3】:

    不要直接换帧,做这样的事情。

    CGRect frame = self. myTableView.frame;
    frame.x =something;
    frame.y=something;
    myTableView.frame=frame;
    

    然后告诉我。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-15
      • 1970-01-01
      • 2015-12-16
      • 1970-01-01
      相关资源
      最近更新 更多