Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why not always use weakSelf in a block?

I understand WHY we would use weakSelf in a block, just not so much when.

I am converting a codebase to ARC which gives a lot of retain cycle warnings with blocks. From the documentation I've gathered that I need to change this:

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

to this:

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

To make the compiler happy and avoid retain loops. My question is why isn't it necessary to change the line:

self.selectedAsset.isFavorite = YES;

to use weakSelf? Doesn't it evaluate to a method call as well? Why doesn't the compiler warn about lines in this format?

[[self selectedAsset]setIsFavorite:YES];

EDIT: I just update to XCode 4.6, and it now generates compiler warnings for just this situation. Funny timing :)

like image 409
VaporwareWolf Avatar asked Jan 29 '13 16:01

VaporwareWolf


1 Answers

My question is why isn't it necessary to change the line:

self.selectedAsset.isFavorite = YES; to use weakSelf? Doesn't it evaluate to a method call as well? Why doesn't the compiler warn about lines in this format?

[[self selectedAsset]setIsFavorite:YES];

Yes, it is exactly a method call. And it does cause a strong reference to self. And it IS necessary to change it to weakSelf if you want it to not retain self.

Compiler warnings do not catch everything.

like image 121
newacct Avatar answered Nov 12 '22 15:11

newacct