翻译iOS堆栈跟踪 - viewDidUnload上的SIGSEGV / SEGV_ACCERR

时间:2012-10-24 15:44:34

标签: objective-c ios segmentation-fault sigsegv

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

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]被称为第一行代码。所以当我完成所有“卸载”工作后,我把它移到了底部。在网上似乎存在一些分歧,这是否真的重要,some SO answers说超级'viewDidUnload方法什么都不做,因此如果你在开头叫它或者无关紧要结束。

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

1 个答案:

答案 0 :(得分:1)

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

如果removeAdView正在撕毁部分自我;如果它导致self被释放到释放点,那么随后对fixLayoutForAdRemoval:的调用可能很容易失败。

打开乐器中的Zombie检测并查看其检测到的内容。