0

私のアプリには、ボタンを押すと、UITableViewのモデルであるNSMutableArrayに文字列を追加するメソッドがあります。

 - (void)addPressed:(id)sender
{
    NSString *string = @"aString";
    [self.array addObject:string];
    NSLog(@"Array count: %d",[self.array count]);
    [self.tableView reloadData];
}

問題は、このアクションに接続されているボタンを2回押した場合にのみ、追加が最初に機能することです。次の出力が得られます。

2012-09-16 21:33:08.766 iUni[3066:c07] Array count: 1 //Which is fine since it worked
2012-09-16 21:33:08.952 iUni[3066:c07] Array count: 1 //Now count should be 2!!

なぜこれが起こっているのか誰もが推測していますか?

@propertyを追加し、それを合成して、次のように怠惰に説明しました。

- (NSMutableArray *)array
{
    if (!_array) {
        NSMutableArray *array = [NSMutableArray array];
        _array = array;
    }
    return _array;
}
4

1 に答える 1

3

配列は、所有されていない(実際には自動解放された)オブジェクトとして作成されています。つまり、アクセサーが呼び出されるたびにすぐに破棄されます。次にアクセスしたときに再作成され、新しい空の配列が提供されます。

インスタンス変数に格納する配列の所有バージョンを作成する必要があります。

if (!_array) {
    _array = [[NSMutableArray alloc] init];
    // Note no need to create a temp variable.
}
return _array;

ARCをオンにすることもできます。これは、これを処理してくれるので、とにかく良いアイデアです。

于 2012-09-16T20:07:01.793 に答える