7

我明白为什么我们会在一个块中使用weakSelf,只是没有那么多。

我正在将代码库转换为 ARC,它会给出很多带有块的保留周期警告。从我收集的文档中,我需要更改它:

[self.selectedAsset addToFavoritesWithCompletion:^(NSError *error) {
    self.selectedAsset.isFavorite = YES;
    [self updateIsFavoriteButton];
}];

对此:

__weak MyViewController* weakSelf = self;
[self.selectedAsset addToFavoritesWithCompletion:^(NSError *error) {
    self.selectedAsset.isFavorite = YES;
    [weakSelf updateIsFavoriteButton];
}];

使编译器满意并避免保留循环。我的问题是为什么不需要更改线路:

self.selectedAsset.isFavorite = YES;

使用弱自我?它不也评估为方法调用吗?为什么编译器不警告这种格式的行?

[[self selectedAsset]setIsFavorite:YES];

编辑:我刚刚更新到 XCode 4.6,现在它会针对这种情况生成编译器警告。有趣的时机:)

4

2 回答 2

8

我的问题是为什么不需要更改线路:

self.selectedAsset.isFavorite = YES;使用weakSelf?它不也评估为方法调用吗?为什么编译器不警告这种格式的行?

[[self selectedAsset]setIsFavorite:YES];

是的,这正是一个方法调用。它确实引起了对self. weakSelf如果您希望它不保留,则有必要将其更改为self.

编译器警告不会捕获所有内容。

于 2013-01-29T19:47:58.523 回答
1
__weak MyViewController* weakSelf = self;
[self.selectedAsset addToFavoritesWithCompletion:^(NSError *error) {
    self.selectedAsset.isFavorite = YES;
    [weakSelf updateIsFavoriteButton];
}];

确实很愚蠢。完成块引用了 self 两次,这将创建一个强引用。它仍然引用 self 一次,这仍然创建一个强引用。如果您也使用强引用,那么弱引用毫无意义。这应该是

__weak MyViewController* weakSelf = self;
[self.selectedAsset addToFavoritesWithCompletion:^(NSError *error) {
    weakSelf.selectedAsset.isFavorite = YES;
    [weakSelf updateIsFavoriteButton];
}];

或更好(因为更安全)

__weak typeof (self) weakSelf = self;
[self.selectedAsset addToFavoritesWithCompletion:^(NSError *error) {
    typeof (self) strongSelf = weakSelf;
    strongSelf.selectedAsset.isFavorite = YES;
    [strongSelf updateIsFavoriteButton];
}];
于 2016-08-08T22:39:05.653 回答