我正在测试 UITableView :(在 ARC 下) 代码如下,
- (void)viewDidLoad
{
[super viewDidLoad];
UnitTest *unitTest = [[UnitTest alloc] init];
UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
tableView.delegate = unitTest;
tableView.dataSource = unitTest;
[self.view addSubview:tableView];
}
我已经在对象单元测试中实现了 tableView 委托(delegate)。当我运行我的项目时,它出现错误:
libobjc.A.dylib`objc_msgSend:
0x30f13f68: teq.w r0, #0
0x30f13f6c: beq 0x30f13faa ; objc_msgSend + 66
0x30f13f6e: push.w {r3, r4}
0x30f13f72: ldr r4, [r0] // Thread 1: BAD_EXE_ACCESS ....
0x30f13f74: lsr.w r9, r1, #2
0x30f13f78: ldr r3, [r4, #8]
0x30f13f7a: add.w r3, r3, #8
0x30f13f7e: ldr r12, [r3, #-8]
控制台中没有任何内容。
当我改变线路时
UnitTest *unitTest = [[UnitTest alloc] init];
至
UnitTest *unitTest = [UnitTest sharedUnitTest]; // i have implement this singleton
一切正常!!为什么
最佳答案
您在 ARC,这在这里意味着一些事情。基本上,您的 unitTest
迟早会被释放,因为您不保留对它的任何引用。但它仍然是 tableView 的委托(delegate)和数据源。因此,一段时间后(为了简化),tableView 将尝试调用其委托(delegate),但 unitTest
将被释放。
因此,这里最简单的解决方案是为 unitTest
创建一个属性:
@property (nonatomic, Strong) UnitTest *unitTest;
在你的头文件中,在你的 .m 中综合它
然后,只需使用:
self.unitTest = [[UnitTest alloc] init];
它应该可以解决所有问题。为此,您可能不需要单例。
PS:单例修复这个问题的原因是单例会“永远存在”(只要应用程序启动)。由于它永远不会被释放,因此当 TableView 尝试调用其委托(delegate)/数据源时不会出现问题。
关于ios - 通过alloc方法初始化单例和普通对象有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13344000/