私はブロックの使用にかなり慣れていません。コードをブロックに動的に追加する方法があるかどうか疑問に思っていますか? 必要に応じて可変ブロック。
2 に答える
これはあなたが望んでいるようには聞こえませんが、完全に同じではないにしても、同様の結果を達成します:__block NSMutableArray
外側のブロック内から順番に呼び出されるブロックを持つ.
ばかげたデモ:
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool {
__block NSMutableArray *subblocks = [NSMutableArray array];
void (^blockWithBlocks)(void) = ^{
NSLog(@"%s: in blockWithBlocks()", __PRETTY_FUNCTION__);
for (void (^subblock)(void) in subblocks) {
subblock();
}
};
for (int i = 0; i < 3; i++) {
void (^subblock)(void) = ^{
NSLog(@"%s: in subblock %d", __PRETTY_FUNCTION__, i);
};
[subblocks addObject:subblock];
}
blockWithBlocks();
}
return 0;
}
ARC の下でブロックをコピーするための要件は流動的であることに注意してください。以前は、clang のドキュメント で説明されている現在のセマンティクスの下[subblocks addObject:[subblock copy]];
では、単に記述するのではなく、記述する必要がありました。[subblocks addObject:subblock];
__strong パラメーター変数の初期化または __weak 変数の読み取りの一部として実行される保持を除いて、これらのセマンティクスがブロック ポインター型の値を保持することを要求する場合は常に、Block_copy の効果があります。オプティマイザーは、結果が呼び出しの引数としてのみ使用されていることを確認すると、そのようなコピーを削除することがあります。
__strong
ブロックがスタック上にないことを確認するためにブロックをコピーする必要があるのは、ブロックがパラメーター変数を持つ関数/メソッドに引数として渡されているときと、ブロックが読み取られているときだけです。__weak
変数。
「コードをブロックに動的に追加する」とはどういう意味ですか? 「コード」と元のブロックから単純に新しいブロックを作成するのとどう違うのですか?
違いが、ブロックへの参照を持ち、その参照に新しいブロックを割り当てることなくその動作を変更したいということである場合、可変状態にブロックを含めることができるブロックキャプチャ可変状態を持つことができます。 @NateChandler が提案するように、後で変更できます。
違いが、「コード」のいくつかの異なる部分から選択できるため、ブロックを作成している場所でハードコーディングできないということである場合は、「コードの部分」をブロックにして選択することができます新しいブロックに入れる正しいブロック。