在对象不为零的情况下,为什么我会得到错误的访问?

时间:2012-09-07 09:08:25

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

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

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

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

崩溃日志:

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");

}

3 个答案:

答案 0 :(得分:0)

你有记忆问题。您的tableView的保留计数为零;所以尽管指向tableView的指针仍然存在,但是系统已经在该实际地址处删除了对象,因此EXC_BAD_ACCESS。

显示tableView的UI可能是隐藏的,因此被卸载了,但是你留下了一些假设表视图仍然存在的逻辑。

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

N.B。将消息发送到nil引用将 not 生成任何错误;这是通过语言设计。

答案 1 :(得分:0)

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

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

答案 2 :(得分:-1)

不要直接改变框架,做这样的事情。

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

让我知道。