2016-11-22 5 views
0

だから私は次のコードを持っている:ここでブロック内に変数を割り当てるには弱い参照が必要ですか?

[serviceHandler getHomeConfigurationData:^(NSDictionary *data){ 
     if (data) { 
      NSLog(@"The Data: %@", data); 
      homeConfigData = data; 
     } 
    } failure:^(NSError *error, BaseServiceHandler *context){ 
     homeConfigData = Nil; 
     NSLog(@"Error: %@", error); 
    }]; 

を、homeConfigDataは私のViewControllerでのインスタンス変数です。このメソッド全体はバックグラウンドスレッドで行われます。補完ブロックが返される/起動されると、ViewControllerが割り当て解除される可能性があります。だから私は私が行をするときに問題を起こすか心配ですhomeConfigData = data;

私はこれをどうやって処理しますか?このよう

答えて

0

YourClass *__weak weakSelf = self; 

[serviceHandler getHomeConfigurationData:^(NSDictionary *data){ 
    if (data) { 
     NSLog(@"The Data: %@", data); 
     weakSelf.homeConfigData = data; 
    } 
} failure:^(NSError *error, BaseServiceHandler *context){ 
    weakSelf.homeConfigData = Nil; 
    NSLog(@"Error: %@", error); 
}]; 

自己なっnilに強いポインタのすべてのインスタンスが割り当て解除し、すべての弱いポインタされた場合、すなわちweakSelfは、nilになります。セレクタsetHomeConfigDataをnilに送信するとnoopになります。

+0

weakSelfがnilになると、Nil = dataとなります。これはクラッシュを引き起こすだろうか? また、私はこれを行うべきであると仮定して正しいですか? また、 "homeConfigData"がインスタンス変数であるためweakSelf.homeConfigDataを実行できません – user1416564

+0

私はあなたの懸念事項に従っていません。 'weakSelf'はインスタンスへのポインタでなければならないので、インスタンス変数を使うべきではありません。 'data'はnilではありませんが、weakSelf.homeConfigData = data'は' weakSelf'がnilになるので何もしません。さらに問題がある場合は、コードを投稿してください。 –

+0

さて、もう一度お試しください。 'homeConfigData'はプライベート変数です。つまり、 'self.homeConfigData'を実行することはできません。それはコンパイルされません。とにかく、私は解決策を見つけ出し、前に '__block'を使って' homeConfigData'を宣言しました。 – user1416564

1

完了ブロックが返されたときにViewControllerが割り当て解除される可能性があります。それは現在書かれているよう

実際には、それらのブロックの両方が(両方のブロックに使用されるselfselfとして保持するためのViewControllerは、時間によってブロックが実行を割り当て解除されていることをない可能であるインスタンスため変数homeConfigDataが使用され、暗黙的にはself->homeConfigDataを意味します)。

+0

興味深い。だから、 'getHomeConfigurationData'メソッド(メソッド呼び出し)が1分遅れて、それを含むViewControllerが解放されることはありませんか? – user1416564

+1

@ user1416564:はい – newacct