1

我有一个接收远程通知的应用程序。推送后显示的我的视图控制器有一个表格视图。应用程序在行设置框架处非常随机地崩溃(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");

}
4

3 回答 3

0

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

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

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

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

于 2012-09-07T09:41:22.590 回答
0

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

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

于 2012-09-10T14:08:51.113 回答
-1

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

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

让我知道。

于 2012-09-07T09:36:57.277 回答