2012-11-12 59 views
0

我測試的UITableView:(下ARC),如下 代碼,通過alloc方法,singleton和common object init之間的區別是什麼?

- (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委託。當我運行我的項目時,它會提取錯誤:

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 

一切正常,OK!爲什麼

回答

1

你在ARC中,它在這裏意味着什麼。基本上,您的unitTest遲早會被釋放,因爲您沒有提及它。但是,它仍然是tableView的委託和數據源。因此,經過一段時間(簡化)後,tableView將嘗試調用其委託,但unitTest將被釋放。

因此,這裏最簡單的辦法,就是創建爲unitTest一個屬性:在你的頭 @property (nonatomic, strong) UnitTest *unitTest;,合成它在您的m

然後,只需使用:

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

它應該修復這一切。你可能不需要一個單獨的。

PS:單身人士解決這個問題的原因是單身人士會「永遠活着」(只要應用程序啓動)。因爲它永遠不會被釋放,當表視圖試圖調用它的委託/數據源時沒有問題。

+0

咋!我懂了!謝謝你,cwehrung – expl

相關問題