通过alloc方法,singleton和common object init有什么区别?

时间:2012-11-12 12:48:39

标签: ios

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

一切正常!为什么

1 个答案:

答案 0 :(得分:1)

你在ARC,这意味着什么。基本上,您的unitTest迟早会被取消分配,因为您不会对其进行任何引用。但是,它仍然是tableView的委托和dataSource。因此,经过一段时间(为了简化),tableView将尝试调用其委托,但unitTest将被释放。

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

中合成

然后,只需使用:

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

它应该解决所有问题。你可能不需要单身人士。

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