0

私は方法を持っています:

- (void)myMethod:(NSError *)error
{
    [[self.data allKeys] enumerateUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
        __block NSString *channelName = obj;
        NSArray *subArray = [self.data objectForKey:obj];
        [subArray enumerateUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
            Wrapper *wrapper = obj;
            [wrapper handleError:error forChannel:channelName];
        }];
    }];
}

1) 内部ブロックのパラメーター obj、idx、および stop に異なる名前を使用する必要がありますか?

2) channelName を __block として定義する必要がありますか?

3) すべてのブロックの外側で弱い自己を定義し、それをブロックで使用する必要がありますか?

編集:

channelName内部ブロックで使用され、ハンドラ ブロックに渡されます。

4

4 に答える 4

2

内側のブロックが外側のブロックのパラメーターにアクセスする必要がない限り、内側のブロックに異なるパラメーター名を使用する必要はありません。内側のブロックでは、重複した名前は単に外側のブロックのパラメーターを非表示にします。名前が異なると、必要に応じて非表示がなくなります。

__block変数をブロック内で変更する場合にのみ、変数にマークを付ける必要があります。変数への読み取り専用アクセスの場合、__blockは必要ありません。

私はself質問の部分について前向きではありません。通常、保持サイクルを引き起こす可能性のある変数を使用している場合、Xcodeに警告が表示されます。警告が表示されない限り、問題はありません。

于 2012-11-04T23:38:39.830 に答える
0

私は正しいことをしていますか?
それはあなたがそれをするのに必要なことをしますか?

内部ブロックのパラメーターobj、idx、およびstopに異なる名前を使用する必要がありますか?
試しましたか?それは機能しますか?

channelNameを__blockとして定義する必要がありますか?
実際にどこかで使っていますか?そうでない場合は、なぜそれをすべて宣言するのですか?

すべてのブロックの外側に弱い自己を定義し、それをブロックで使用する必要がありますか?
いいえ、ここには保持サイクルはありません


辞書でブロック列挙を使用して、これを少しクリーンアップすることを検討できます。

[self.data enumerateKeysAndObjectsUsingBlock:^(id key, NSArray *subArray, BOOL *stop) {
    [subArray enumerateUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
        Wrapper *wrapper = obj;
        [wrapper handleError:error];
    }];
}];
于 2012-11-04T23:39:11.360 に答える
0

私は正しいことをしていますか?

いいえ、両方の引数リストの前にブロックリテラル宣言子(^)がありません。 はい。

内部ブロックのパラメーターobj、idx、およびstopに異なる名前を使用する必要がありますか?

いいえ。これらの引数はブロックの引数であり、そのスコープ内でアクセスできます。

channelNameを__blockとして定義する必要がありますか?

いいえ。ブロックのスコープ内で宣言され、そのブロック内でのみ変更されるため、__block指定子は必要ありません。 __blockブロックのスコープ外の変数を、ブロックのコンテキストで可変として宣言します。

すべてのブロックの外側に弱い自己を定義し、それをブロックで使用する必要がありますか?

いいえ、でもそれはとても良い考えです。ブロックはそのスコープを保持します。

于 2012-11-04T23:39:45.957 に答える
0

ブロックは同期的に実行され、ヒープにコピーされないため、追加の操作は必要ありません。考慮すべき特別なメモリ管理はなく (つまり、弱い参照は必要ありません)、__block修飾子も必要ありません (内側のブロックが外側の変数を変更する必要がない限り)。

言い換えれば、ここにあるのは単純なネストされた for ループだけです。メモリ管理は、実際の for ループと同じです。

于 2012-11-05T00:37:31.013 に答える