2012-08-01 14 views
6

ブロック内のインスタンス変数を変更する方法についてはかなり混乱しています。ブロック内のインスタンス変数を変更する

インターフェイスファイル(.H):

@interface TPFavoritesViewController : UIViewController { 
    bool refreshing; 
} 

実装:

__weak TPFavoritesViewController *temp_self = self; 
refreshing = NO; 
[myTableView addPullToRefreshWithActionHandler:^{ 
    refreshing = YES; 
    [temp_self refresh]; 
}]; 

お察しの通り、私は内部のさわやかIVARを変更しようとすると、私はサイクルの警告を保持取得ブロック。エラーを出さずにこれをどうすればいいですか?

self->refreshing = YES; 

ので、サイクル警告:refreshing

答えて

6

あなたの割り当ては、それがために速記で、selfへの暗黙の参照です。それを次のように変更してください:

temp_self->refreshing = YES; 
+2

このコードではビルドされません。次のエラーが表示されます。__weakを間接参照することは、競合状態によって発生した可能性のあるnull値のために許可されていません。まず、それを強力な変数に割り当てます。私はこれを追加することによってそれが働いていると思う:__strong TPRideListView * strong_self = temp_self; strong_self-> refreshing = YES; –

+0

注意してください。弱いポインタの参照を解除するとクラッシュする可能性があります。ブロック内の弱いポインタから強いポインタを作成し、nilをチェックして、それを使うのがよいでしょう。 –

+0

@ケランパスター - 謝罪私は第2の警告を逃した。あなたのコードがその警告をそのまま残しておくなら、あなたのオブジェクトが周りにいる(つまり、 'self'が有効です)*提供されています。コードは 'nil'値の可能性を扱っていません。私はあなたがそうであると知っていると思います。 – CRD

関連する問題