保持完成块的循环

在我的课上,我创build了这个方法。

-(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]; }]; 

假设你的类中没有variables存储块,那么这两个例子都不是保留周期。 该块有一个引用自我,但自我不保留一个块的引用。

由于方法的命名,你会在第二种情况下得到警告。 它以“set”开始,因此代码分析器假定它正在设置你的类的一个variables。 给它一个不同的名字,警告应该消失。

但是,如果您只是从方法中同步调用它们,则使用完成块编码是一种奇怪的方法。 因此,我怀疑你实际上是把块存储在某个地方,然后asynchronous地调用它们。 在这种情况下,这可能是一个保留周期,取决于您如何以及在哪里存储它们。