0

ネストされたブロックの __block 変数に問題があります。私の質問は、次のようなコードが機能するかどうかです。

__block NSString* s = nil;
[self methodWithBlock:^
 {
    s = [self methodThatReturnsAnAutoreleasedString];
    [self methodWithBlock:^
     {
         [NSLog @"%d", s.length];
     }];
 }];

内部ブロックsが保持されていると仮定しましたが、私のコードではそうではないようです。内部ブロックにアクセスすると、 「割り当て解除されたインスタンスにメッセージが送信されました」と表示されます。s割り当て時に s を保持すると ( s = [[self methodThatReturnsAnAutoreleasedString] retain];)、正常に動作します。

もちろん、それは私の実際のコードではなく、より複雑ですが、その最小限の例がうまく機能するかどうかを知りたいだけです。もしそうなら、他の場所で問題を探す必要があります。

4

1 に答える 1

3

(ARC を使用していないと仮定します。) Transitioning to ARC Release Notes から:

手動参照カウント モードで__block id x;は、 を保持しないという効果がありxます。

したがって、あなたの仮定は間違っています。ブロックは保持されませんsmethodWithBlock非同期で動作する場合は、それを保持する必要があり ます。

于 2013-05-07T14:46:41.700 に答える