5

ブロックを返すメソッドと、そのメソッドを使用する別のメソッドがあります。

- (MyBlock)blockForParameter:(id)param
{
    MyBlock theBlock = ^(){NSLog(@"Param: %@", param);};
    return theBlock;
}

- (void)methodUser
{
    MyBlock theBlock = [self blockForParameter:something];
    [self.allBlocks addObject:theBlock];
}

問題は、いつブロックをコピーする必要があるかということです。で返すときにブロックをコピーする必要がblockForParameterありますか、それとも配列に追加するときにブロックをコピーする必要がありますか?

ありがとう

4

2 に答える 2

3

ブロックが「作成されたスコープを超えて存続する」場合、ブロックをコピーする必要があるため、blockForParameterメソッドでブロックをコピーしてから返す必要があります。

編集: ARC では、これは当てはまりません。たとえば、Objective-C: ARC のブロックとその中の参照を参照してください。

  • 関数からブロックを返す場合、ブロックをコピーする必要はありません。
  • コレクションにブロックを追加するには、ブロック コピーが必要です。
于 2013-03-19T21:48:18.040 に答える
1

各方法を個別に見てください。

では-blockForParameter:、ブロック リテラルがメソッドから返されます。リテラルの有効範囲を超えるためには、ブロックをコピーする必要があります。MRC では、コピーされ自動解放されたブロックを返す必要があります。ARC では、何もする必要はありません。

では-methodUser、ブロックはそのメソッドで定義されていません。メソッド呼び出しから受け取ります。したがって、すでにコピーされている必要があります (つまり、スタック ブロックではありません)。したがって、それを行うときに何もする必要はありませんaddObject:

于 2013-03-19T22:56:36.127 に答える