2

我需要在两个块中执行相同的一堆代码(我正在使用 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在内部使用。如果不是,那么这里的正确方法是什么?顺便说一句:self 是一个 viewController,可以解除分配(doB: 和 doA: 块是基于网络的,所以可能很慢)。

4

1 回答 1

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(例如,使用属性或实例变量)并且您正在捕获self内部,请使用“weakSelf”模式block,例如:

 @property(strong) void(^)(void) completionBlock;
....

__weak typeof(self) weakSelf = self; 

    self.completionBlock = ^{
      // Don't use "self" here, it will be captured by the block and a retain cycle will be created
      // But if we use "weakSelf" here many times, it risques that it will be nil at the end of the block
      // You should create an othere strong reference to the "weakSelf"
      __strong typeof(self) strongSelf = weakSelf; 
      // here you use strongSelf ( and not "weakSelf" and especially not "self")
    };
于 2014-06-26T11:56:40.510 回答