在我班上,我创造了这种方法。
-(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];
}];
答案 0 :(得分:2)
假设您的类中没有存储块的变量,那么这两个示例都不是保留周期。该块具有对self的引用,但self不会保留对该块的引用。
由于方法的命名,在第二种情况下会收到警告。它以“set”开头,因此代码分析器假设它正在设置类的变量。给它一个不同的名字,警告应该消失。
但是,如果只从方法中同步调用它们,则使用完成块进行编码是一种奇怪的方式。因此,我怀疑你确实将块存储在某个地方,然后异步调用它们。在这种情况下,它可能是一个保留周期,具体取决于您存储它们的方式和位置。