1

Objective-C のブロックに関する私の質問: 次の状況を想定します (ARC が有効になっている場合):

typedef NSString*(^MyBlockType)();
typedef NSString*(^MyReturnBlockType)(MyBlockType);

- (MyReturnBlockType) foo: (MyBlockType) block
{
    return ^NSString*(MyBlockType someBlock) {
        return someBlock();
    };
}

blockメソッドが受け取るパラメーターは、メソッドfoo:が返すブロック内で使用されます。しかし、誰が強い参照を保持していblockますか? foo:ブロックを返す前にブロックをコピーする必要がありますMyReturnBlockTypeか? 任意の洞察をいただければ幸いです。

4

1 に答える 1

1
  1. このパラメーターblockは、コード内のどこにも使用されていません。

  2. block内部で使用するつもりだったとしましょうsomeBlock。ブロックによってキャプチャされたオブジェクト ポインター型の変数は、ブロックがコピーされるときに保持されます。さらに、ブロックによってキャプチャされたブロックポインター型の変数は、ブロックがコピーされるときにコピーされます。したがって、someBlockがコピーさblockれると、コピーされます。

  3. ARC では、直接返されたスタック ブロックは、返される前に自動的にコピーされます。したがって、someBlockも もblockコピーされます。

  4. いいえ、foo:明示的にコピーする必要はありませんblock。(インスタンス変数などに) 明示的に格納するために何もしていないためです。

于 2013-09-04T22:18:10.573 に答える