在我的应用中,我有以下代码:
__weak __typeof(self)weakSelf = self;
_pingTimer = [NSTimer scheduledTimerWithTimeInterval:5.0
repeats:YES
block:^(NSTimer * _Nonnull timer)
{
__strong __typeof(weakSelf)strongSelf = weakSelf;
[strongSelf pingWithBlock:nil];
}];
这在iOS 10+中完美运行,但我也需要该应用程序来支持iOS 9。所以我需要提供一种适合两者的方法。
我试过了:
__weak __typeof(self)weakSelf = self;
_pingTimer = [NSTimer scheduledTimerWithTimeInterval:5.0
target:weakSelf
selector:@selector(pingWithBlock:)
userInfo:nil
repeats:YES];
pingWithBlock方法在同一个类中定义,它是一个实例方法。
但这似乎不起作用,这意味着我的内存访问崩溃了。
如果有人有任何建议,我们将非常感激。
编辑: 感谢下面的@dgatwood解释代码修复了问题
- (void)autoPing
{
_pingTimer = [NSTimer scheduledTimerWithTimeInterval:self.autoCheckInterval
target:self
selector:@selector(pingWithBlock)
userInfo:nil
repeats:YES];
}
-(void)pingWithBlock
{
[self pingWithBlock:nil];
}
答案 0 :(得分:0)
这有点奇怪。 NSTimer保留其目标。也许这种情况不会因为__weak
而发生,但我认为无论如何都是这样。 * *耸肩
无论哪种方式,这听起来像多线程竞争条件:
最好的解决方法是让计时器保留目标对象(通过删除所有weakSelf
内容)。如果计时器是重复计时器,请提供一种方法,允许处理封闭对象的代码取消该计时器,并小心始终调用它。