在完成块中保留循环

时间:2012-10-16 12:57:27

标签: iphone objective-c ios xcode cocoa

在我班上,我创造了这种方法。

-(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吗? (我没有得到任何警告)

更新

IN在这种情况下的另一个类我得到了保留周期的警告

typedef void (^SetFavoriteCompletionBlock)(NSError*);

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

然后在这个电话中我收到了警告

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

1 个答案:

答案 0 :(得分:2)

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

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

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