+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block
这种创建形式可以把timer西东加入到当前的runloop中,不需要手动开启。
+ (NSTimer *)timerWithTimeInterval:(NSTimeInterval)interval repeats:(BOOL)repeats block:(void (^)(NSTimer *timer))block
- (void)addTimer:(NSTimer *)timer forMode:(NSRunLoopMode)mode;
这种创建形式不会自动添加到runloop中,需要我们手动添加到runloop中。
需要注意的是:
每个线程都对应一个Runloop,而主线程的Runloop默认是开启的,子线程的Runloop默认不是开启的.通常情况我们的Timer是在主线程中创建的,但是也不乏有的时候是在子线程中创建的。在子线程创建Timer需要加入Runloop后,需要我们手动开启Runloop。
[[NSRunLoopcurrentRunLoop]run];
用target的形式创建timer会出现释放timer。
+ (NSTimer *)scheduledTimerWithTimeInterval:(NSTimeInterval)ti target:(id)aTarget selector:(SEL)aSelector userInfo:(nullable id)userInfo repeats:(BOOL)yesOrNo;
出现上边的问题是什么原因呢?
Creates and returns a new NSTimer object and schedules it on the current run loop in the default mode.
After ti seconds have elapsed, the timer fires, sending the message aSelector to target.
repeats
If YES, the timer will repeatedly reschedule it self until invalidated. If NO, the timer will be invalidated after it fires.
上边的是苹果给的解释,把创建的timer加入了当前的runloop中,即当前的runloop对target进行了强引用。而timer又对target进行了强引用。这导致来返回上个界面,target恶妇啊释放。因此必须手动停掉。