我有一个接收远程通知的应用程序。推送后显示的视图控制器有一个表视图。应用程序在线路设置帧随机崩溃(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");
}
您有内存问题。您的tableView的保留计数为零;因此,尽管指向tableView的指针仍然存在,但系统已经破坏了该实际地址的对象,因此EXC_BAD_ACCESS。
显示tableView的UI可能是隐藏的,因此被卸载,但您留下了一些逻辑,假设表视图在不存在时仍然存在。
如果没有看到更多的项目,很难调试正在发生的事情。对您来说,最好的做法是仔细查看应用程序和UI流的设计。是什么原因导致UI被释放?您是如何输入假设UI的一部分仍然存在的代码的?
N。B.向nil引用发送消息不会产生任何错误;这是通过语言设计。
我在这里找到了解决方案:使用ARC和UITableViewController正在抛出观测信息被泄露,甚至可能被错误地附加到其他对象
似乎拉取刷新(子视图到表视图)导致了问题。
不要直接更改框架,可以这样做。
CGRect frame = self. myTableView.frame;
frame.x =something;
frame.y=something;
myTableView.frame=frame;
让我知道。