Given the following:
- (void) someMethod { dispatch_async(dispatch_get_main_queue(), ^{ myTimer = [NSTimer scheduledTimerWithTimeInterval: 60 target: self selector: @selector(doSomething) userInfo: nil repeats: NO]; }); }
Where myTimer is declared in a private interface:
@interface MyClass() { NSTimer * myTimer; } @end
How would one fix the following warning:
Block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior
From what I have found so far, most suggestions involve putting something such as:
- (void) someMethod { __typeof__(self) __weak wself = self; dispatch_async(dispatch_get_main_queue(), ^{ wself.myTimer = [NSTimer scheduledTimerWithTimeInterval: 60 target: self selector: @selector(doSomething) userInfo: nil repeats: NO]; }); }
Except, that myTimer is an ivar, meaning wself
does not have access to any properties.
I guess my questions are:
I use ivars quite a bit through my code. I just added the -Weverything
flag to my project to see if I can find any underlying issues and this is by far the most common warning. I have no problem going though and fixing it by making my ivars properties, but I want to make sure I get a better understanding before I do that.
Replacing myTimer
by self->myTimer
would fix your warning.
When you use an iVar _iVar
in the code, the compiler will replace the code by self->_iVar
, and if you use it inside a block, the block will capture self instead of the iVar itself. The warning is just to make sure the the developer understand this behaviour.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With