使用自身内部块的方法

时间:2014-06-26 11:10:46

标签: objective-c block retain-cycle

我需要在两个块中执行相同的代码串(我正在使用ARC):

__weak typeof(self) weakSelf = self;
[_dataProvider doA:^(NSError *error) {
    [weakSelf handleError:error];
}];

在另一个地方我打电话:

__weak typeof(self) weakSelf = self;
[_dataProvider doB:^(NSError *error) {
    [weakSelf handleError:error];
}];

然后我有我的经纪人:

- (void)handleError:(NSError *)error {
    [self.refreshControl endRefreshing];
    [self.tableView reloadData];
}

以这种方式使用它可以节省吗?请注意handleError:方法内部使用self。如果没有,那么这里适当的方法是什么? BTW:self是一个viewController,可以解除分配(doB:和doA:块基于网络,所以可能很慢)。

1 个答案:

答案 0 :(得分:2)

这样做是不安全的,即使许多人这样做也是如此。

当对齐时,您应该将“weakSelf”模式与块一起使用。 在您的示例中,“weakSelf”模式不合理,因为self没有对strong的任何block引用。您可以这样使用:

[_dataProvider doA:^(NSError *error) {
    // here you can use self, because you don't have any strong reference to your block

    [weakSelf handleError:error];
}];

如果您对strong(例如属性或实例变量)有block引用并且您正在{{1}内捕获self,请使用“weakSelf”模式例如:

block