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.
Xcode: 9.2, 10.2, 11.0 (11A420a)
I have swift project. Warning Block implicitly retains 'self'; explicitly mention 'self' to indicate this is intended behavior
appears when I use Objective-C pods:
CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = NO
Add to the end of your Podfile:
post_install do |installer|
installer.pods_project.targets.each do |target|
target.build_configurations.each do |config|
config.build_settings['CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF'] = 'NO'
end
end
end