保留在完成块周期(Retain cycle in completion block)

2019-09-24 04:46发布

在我的课堂我创造了这个方法。

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

Answer 1:

假如你没有在你的类存储块,则两个例子是保留周期的变量。 该区块拥有自主的引用,但自不保留对块的引用。

你得到,因为该方法的命名在第二种情况下的警告。 它从“设置”,因此代码分析器假定它设置你的类的变量。 给它一个不同的名称,并警告应该消失。

然而,它与完成块编码,如果你只从方法同步打电话给他们的一种奇怪的方式。 因此,我怀疑你其实存储块的某个地方,然后异步调用它们。 在这种情况下,它可能是一个保留周期,这取决于你如何以及在何处存储它们。



文章来源: Retain cycle in completion block