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 に答える