0

ブロック内のオブジェクトの弱い参照を定義するには、次のようなものを使用します

MyViewController *__weak weakSelf= self;
UILabel *__weak weakLabel=ALabel;

///the block code with some examples
up2.completionBlock = ^(NSDictionary *headers, NSString *responseString) { 

   [weakSelf aMethodInTheController];
   [weakLabel setHidden:NO];


};

bool に問題があります。bool への弱い参照を宣言して、「このブロックで自己を強力にキャプチャすると、保持サイクルが発生する可能性があります」という警告を回避するにはどうすればよいですか? 以下では動作しません:

Bool *__weak weakFlag=Aflag;
4

1 に答える 1

0

ここで何をしようとしているのかは明らかではありません。

2 つの可能性があります。おそらく、ブロックにパラメーターを渡す必要があります。したがって、タイプboolorの変数がありBOOL(この質問の目的では類似しています)、ブロックでそれを使用したいと考えています。

それでは、朗報です!何も必要ありません。宣言するだけ

  BOOL some_bool = (YES or NO or some calculation);

後でブロックで使用します。これが機能するのは、ブール型がプリミティブ (ある種の整数) であり、メモリ管理に参加するほどスマートではないためです。したがって、コンパイラはあまり心配しません。ブロックの作成時にこの変数の値を取得し、それをブロックにコピーするだけです。

関連するドキュメントは次のとおりです。

特に指定しない限り、値のみがキャプチャされます。つまり、ブロックを定義してから呼び出されるまでの間に変数の外部値を変更すると、...

あるいは、論理値を取ることができ、ブロックを作成してから実行するまでの間、他のオブジェクトによって変更できる変数が必要になる場合があります。その場合、あなたがする必要があります

  1. ブール値をラップするNSNumber
  2. これへの強い参照をNSNumberオブジェクトのどこかに保存します
  3. ブロックへの弱いポインタとして渡す

例えば

// somewhere in the interface
@property NSNumber *someImportantFlag

 __weak NSNumber *weakFlag = someImportantFlag;
 ... ^{ ... if(weakFlag.boolValue) ... weakFlag = @(NO); ...} 

質問と私の回答を読み直してくれたコメンターに感謝します。

于 2013-09-27T16:06:51.267 に答える