在我的iphone项目中,我总是将UITableView作为IBOutlet插入到视图控制器中,大多数时候它运行良好,但是当popToRootViewControllerAnimated调用动画时会发生随机崩溃。通过僵尸跟踪,发现崩溃是由于UITableView实例已经被释放,但仍然有系统事件发送给它,所以崩溃。
我总是通过视图控制器的 dealloc 方法中的以下方法之一来解决此类问题。
tableView.dataSource = nil; (work for most cases)
or
[tableView removeFromSuperview]; (work for some special cases)
虽然可以通过上述更改修复崩溃,但我仍然感到困惑。
- 我们需要显式地将其 dataSource 设置为 nil 以避免崩溃,这是苹果的缺陷吗?或者我们自己的应用程序代码有问题?
- 有谁也经历过这样的崩溃,你知道根本原因是什么吗?
任何想法或讨论将不胜感激,提前致谢。
enter code here
Exception Type: EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x626f6d37
Crashed Thread: 0
Thread 0 name: Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libobjc.A.dylib 0x33fe0c98 objc_msgSend + 16
1 UIKit 0x364538f6 -[UITableView(UITableViewInternal) _spacingForExtraSeparators] + 58
2 UIKit 0x3645337a -[UITableView(_UITableViewPrivate) _adjustExtraSeparators] + 158
3 UIKit 0x36453218 -[UITableView layoutSubviews] + 40
4 UIKit 0x363ff5f4 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 20
5 CoreFoundation 0x30e13efc -[NSObject(NSObject) performSelector:withObject:] + 16
6 QuartzCore 0x33d8dbae -[CALayer layoutSublayers] + 114
7 QuartzCore 0x33d8d966 CALayerLayoutIfNeeded + 178
8 QuartzCore 0x33d931be CA::Context::commit_transaction(CA::Transaction*) + 206
9 QuartzCore 0x33d92fd0 CA::Transaction::commit() + 184
10 QuartzCore 0x33d8c04e CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 50
11 CoreFoundation 0x30e7da2e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 10
12 CoreFoundation 0x30e7f45e __CFRunLoopDoObservers + 406
13 CoreFoundation 0x30e80754 __CFRunLoopRun + 848
14 CoreFoundation 0x30e10ebc CFRunLoopRunSpecific + 224
15 CoreFoundation 0x30e10dc4 CFRunLoopRunInMode + 52
16 GraphicsServices 0x34efe418 GSEventRunModal + 108
17 GraphicsServices 0x34efe4c4 GSEventRun + 56
18 UIKit 0x36428d62 -[UIApplication _run] + 398
19 UIKit 0x36426800 UIApplicationMain + 664
20 ScoutFree 0x00099558 0x1000 + 623960
21 ScoutFree 0x00003618 0x1000 + 9752
您忘记将 tableView.delegate 设置为 nil,因此您仍然可能会崩溃,特别是当动画正在进行时(因为它现在要求死控制器提供新行)。这不是苹果的缺陷,程序员有责任清除这些引用。因此将tableView的dataSource和delegate属性设置为nil,然后释放tableview(通过将相应属性设置为nil或像这样释放iVar [_iVar release]; iVar = nil;)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)