0

我正在测试 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

一切正常!!为什么

4

1 回答 1

1

你在 ARC,这意味着什么。基本上,您unitTest迟早会被解除分配,因为您不保留对它的任何引用。但是,它仍然是 tableView 的委托和数据源。因此,一段时间后(为了简化),tableView 将尝试调用它的委托,但该委托unitTest已被释放。

因此,这里最简单的解决方案是在标题中为unitTest: 创建一个属性@property (nonatomic, strong) UnitTest *unitTest;,在 .m 中合成它

然后,只需使用:

self.unitTest = [[UnitTest alloc] init];

它应该解决这一切。您可能不需要单例。

PS:单例解决这个问题的原因是单例将“永远活着”(只要应用程序启动)。因为它永远不会被释放,所以当表视图尝试调用其委托/数据源时没有问题。

于 2012-11-12T12:54:50.187 回答