これを実行し、dealloc、arc、retaincyclesなどを自動処理するマクロを作成しました。弱参照の使用について心配する必要はありません。また、常にメインスレッドになります
#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がいつdeallocする必要があるかをチェックしているためです。