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