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

假设您的类中没有存储块的变量,那么这两个示例都不是保留周期。该块具有对自身的引用,但自身不保留对该块的引用。

由于方法的命名,您会在第二种情况下收到警告。它以“set”开头,因此代码分析器假定它正在设置您的类的变量。给它一个不同的名字,警告就会消失。

但是,如果您只从方法中同步调用它们,那么使用完成块进行编码是一种奇怪的方式。因此,我怀疑您实际上确实将块存储在某个地方,然后异步调用它们。在这种情况下,它可能是一个保留周期,具体取决于您存储它们的方式和位置。

于 2012-10-16T14:06:22.087 回答