我正在测试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];
}
我在Object UnitTest中实现了tableView委托。当我运行我的项目时,它会收到一个错误:
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
一切正常!为什么
答案 0 :(得分:1)
你在ARC,这意味着什么。基本上,您的unitTest
迟早会被取消分配,因为您不会对其进行任何引用。但是,它仍然是tableView的委托和dataSource。因此,经过一段时间(为了简化),tableView将尝试调用其委托,但unitTest
将被释放。
因此,这里最简单的解决方案是为unitTest
创建一个属性:
标题中的@property (nonatomic, strong) UnitTest *unitTest;
,在.m
然后,只需使用:
self.unitTest = [[UnitTest alloc] init];
它应该解决所有问题。你可能不需要单身人士。
PS:单身人士解决这个问题的原因是单身人士将“永远活着”(只要应用程序启动)。因为它永远不会被释放,所以当表视图尝试调用其delegate / dataSource时没有问题。