0

我猜这个问题是一个生命周期问题。应用程序收到内存警告并尝试卸载一些用户界面项。但我不是 100% 确定如何在堆栈跟踪上最后报告的项目的上下文中解释错误。

Exception Type:  SIGSEGV
Exception Codes: SEGV_ACCERR at 0xa0d9f968
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                     0x361dc026 objc_msgSend_stret + 18
1   TheApp                              0x000b4d31 -**[TheAppFeedController removeAdView]** (TheAppFeedController.m:**189**)
2   TheApp                              0x0000d68d -[TheAppViewController viewDidUnload] (TheAppViewController.m:177)
3   TheApp                              0x000b4a63 -[TheAppFeedController viewDidUnload] (TheAppFeedController.m:137)
4   UIKit                               0x32e66a37 -[UIViewController unloadViewForced:] + 251
5   UIKit                               0x32fae3ad -[UIViewController purgeMemoryForReason:] + 65

所以堆栈跟踪指向这个方法,它为什么会抛出这个错误并没有真正的意义。

-(void) removeAdView {
    [super removeAdView];
    [self fixLayoutForAdRemoval:self.tableView];
}

当您查找堆栈时,我确实注意到的一件事[super viewDidUnload]是被称为第一行代码。因此,在完成所有“卸载”工作后,我将其移至底部。无论这是否真的重要,网上似乎都存在一些分歧,一些 SO 答案说超类的viewDidUnload方法什么都不做,因此在开始或结束时调用它并不重要。

所以我做了那个改变,但是因为我从来没有能够重现这个错误,所以我不确定它是否是实际的修复。想获得更多关于这个问题的意见,看看我的推理是否正确。

4

1 回答 1

1
[super removeAdView];
[self fixLayoutForAdRemoval:self.tableView];

如果removeAdView正在拆除自己的一部分;如果它导致self被释放到释放点,那么随后的调用fixLayoutForAdRemoval:很容易失败。

在 Instruments 中打开 Zombie detection 并查看它检测到的内容。

于 2012-10-24T16:46:04.153 回答