【发布时间】:2012-10-24 15:44:34
【问题描述】:
我猜这个问题是一个生命周期问题。应用程序收到内存警告并尝试卸载一些用户界面项。但我不是 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] 被调用为第一行代码。因此,在完成所有“卸载”工作后,我将其移至底部。这是否真的重要,网上似乎有一些分歧,some SO answers 说超类的viewDidUnload 方法什么都不做,因此无论你在开头还是结尾调用它都没有关系。
所以我进行了更改,但由于我从未能够重现此错误,因此我不确定它是否是实际修复。想了解更多关于这个问题的意见,看看我的推理是否正确。
【问题讨论】:
-
我不确定我是否理解:通过移动
[super viewDidUnload],修复了崩溃;如果您将其恢复为第一行,则会发生崩溃;这是你说的吗? -
我提到我从未能够重现此错误。我正在通过 HockeyApp 从“野外”收到此崩溃日志......所以我希望为我们的客户解决这个问题
-
TheAppFeedController.m line 189是哪一行? -
这很奇怪,189 是
removeAdView方法的右括号:-/
标签: objective-c ios segmentation-fault