【问题标题】:Retain cycle in completion block在完成块中保留循环
【发布时间】:2012-10-16 12:57:26
【问题描述】:

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

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

【问题讨论】:

  • 您从哪里得到有关保留周期的警告?而且,你也可以发布你的界面吗?

标签: iphone objective-c ios xcode cocoa


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-28
    • 2013-03-10
    • 2012-07-26
    相关资源
    最近更新 更多