3

私のクラスでは、このメソッドを作成しました。

-(void) refreshDatasourceWithSuccess:(CreateDataSourceSuccessBlock) successBlock 
                         failure:(CreateDataSourceFailureBlock) failureBlock;

それから私はそれをこのように呼びます:

[self refreshDatasourceWithSuccess:^(NSArray* array){
    //Success block 
    [self setDataSource:array];
    [self.tableView reloadData];

} failure:^(NSError* error){
    // failure block 
    [self showConnnectionError];
}];

self完了ブロック内を参照しているため、これは保持サイクルですか?(警告は表示されません)

アップデート:

この場合の別のクラスでは、保持サイクルに関する警告が表示されます

typedef void (^SetFavoriteCompletionBlock)(NSError*);

-(void)setFavoriteFriend:(BOOL)pSetFavorite
          completion:(SetFavoriteCompletionBlock)completionBlock
{
   //....
   completionBlock(error);
}

そして、この呼び出しで私は警告を受け取ります

[self setFavoriteFriend:setFavorite 
             completion:^(NSError *error){
                 [self.tableView reloadData];
             }];
4

1 に答える 1

3

ブロックを格納する変数がクラスにない場合、どちらの例も保持サイクルではありません。ブロックには自己への参照がありますが、自己はブロックへの参照を保持しません。

2番目のケースでは、メソッドの名前が原因で警告が表示されます。これは「set」で始まるため、コードアナライザーはクラスの変数を設定していると想定します。別の名前を付けると、警告が消えるはずです。

ただし、メソッドから同期的に呼び出すだけの場合、完了ブロックを使用してコーディングするのは奇妙な方法です。したがって、実際にはブロックをどこかに保存してから、非同期で呼び出すのではないかと思います。その場合、それらを保存する方法と場所によっては、保持サイクルになる可能性があります。

于 2012-10-16T14:06:22.087 に答える