我已经制作了一个宏来执行此操作并自动处理 dealloc、arc、retain 循环等。无需担心使用弱引用。它也将始终在主线程上
#define inlineTimer(__interval, __block) {\
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((0.0) * NSEC_PER_SEC)), dispatch_get_main_queue(), (__block));\
[NSTimer scheduledTimerWithTimeInterval:__interval repeats:YES block:^(NSTimer *__timer) {\
if (self.window != nil) {\
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)((0.0) * NSEC_PER_SEC)), dispatch_get_main_queue(), (__block));\
} else {\
[__timer invalidate];\
}\
}];\
}
示例用法:
__block ticks = 0;
inlineTimer(0.5, ^{
ticks++;
self.label.text = [NSString stringWithFormat:@"Ticks: %i", ticks];//strong reference to self and self.label won't cause retain cycle! Wahoo
});
请注意 self.label 不是弱引用,但由于宏的结构,这一切都会自动释放。
当然,这仅适用于 UI 类,因为它正在检查 .window 何时应该解除分配。