10

プロパティによって強く定義されている NSMutableArray にオブジェクトを追加する適切な方法は何ですか。

[tapBlockView setTapBlock:^(UIImage* image) {
   [self.myImageArray addObject:image]; // self retain cycle
}

次のような弱い参照を作成する場合

__weak NSMutableArray *array = self.myImageArray;
[tapBlockView setTapBlock:^(UIImage* image) {
    [array addObject:image]; // If I will do this then how will I update original Array ?
}

私も試してみました

__weak id weakSelf = self;
[tapBlockView setTapBlock:^(UIImage* image) {
    [weakSelf storeImageInaNewMethod:image]; // Calling SToreImageInaNewMethod
}

-(void)storeImageInaNewMethod:(UIImage*)image {
   [self.myImageArray addObject:image]; // This again retaining cycle
}

プロパティで定義された元のオブジェクトを更新する適切な方法は何ですか?

4

4 に答える 4

15

maddy の回答の後 - これは、GCD と非同期プログラミングに関する 2012 年の WWDC レクチャーからのものです。

__weak MyClass *weakSelf = self;

[tapBlockView setTapBlock:^(UIImage* image) {
    __strong MyClass *strongSelf = weakSelf;
    if(strongSelf) {
        [strongSelf.myImageArray addObject:image];
    }
}];
于 2012-11-06T19:21:45.000 に答える
9

2番目と3番目を組み合わせてみてください。

__weak id weakSelf = self;
[tapBlockView setTapBlock:^(UIImage* image) {
    [weakSelf.myImageArray addObject:image];
}
于 2012-11-06T19:17:35.377 に答える
1

あなたの場合、によって参照される配列を参照するだけでよいselfので、次のようになります。

NSMutableArray *array = self.myImageArray;
[tapBlockView setTapBlock:^(UIImage* image)
                          {
                             [array addObject:image]; // No cycle
                          }];

異なる時間に異なる配列参照を返さない限り、正常に動作します。self.myImageArrayサイクルはありません。現在のオブジェクトが配列とブロックを参照し、次にブロックが配列を参照します。

self.myImageArray異なる時間として異なる配列参照を返す場合はself、ケース 3 への弱い参照を使用します。

于 2012-11-06T19:34:28.460 に答える
0

2 番目と 3 番目のものは正しく表示されます。2 番目の配列は、配列のコピーを作成しなかったため機能し、元の配列を引き続き指しています。3 番目の方法は、self への参照が弱いため機能します。

于 2012-11-06T19:16:29.450 に答える