@@ -128,10 +128,39 @@ [timer retain]; objc_autoreleasePoolPop(pool); return [timer autorelease]; } + ++ (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval + target: (id)target + selector: (SEL)selector + object: (id)object1 + object: (id)object2 + object: (id)object3 + object: (id)object4 + repeats: (bool)repeats +{ + void *pool = objc_autoreleasePoolPush(); + OFDate *fireDate = [OFDate dateWithTimeIntervalSinceNow: timeInterval]; + id timer = [[[self alloc] initWithFireDate: fireDate + interval: timeInterval + target: target + selector: selector + object: object1 + object: object2 + object: object3 + object: object4 + repeats: repeats] autorelease]; + + [[OFRunLoop currentRunLoop] addTimer: timer]; + + [timer retain]; + objc_autoreleasePoolPop(pool); + + return [timer autorelease]; +} #ifdef OF_HAVE_BLOCKS + (instancetype)scheduledTimerWithTimeInterval: (of_time_interval_t)timeInterval repeats: (bool)repeats block: (of_timer_block_t)block @@ -237,10 +266,37 @@ [timer retain]; objc_autoreleasePoolPop(pool); return [timer autorelease]; } + ++ (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval + target: (id)target + selector: (SEL)selector + object: (id)object1 + object: (id)object2 + object: (id)object3 + object: (id)object4 + repeats: (bool)repeats +{ + void *pool = objc_autoreleasePoolPush(); + OFDate *fireDate = [OFDate dateWithTimeIntervalSinceNow: timeInterval]; + id timer = [[[self alloc] initWithFireDate: fireDate + interval: timeInterval + target: target + selector: selector + object: object1 + object: object2 + object: object3 + object: object4 + repeats: repeats] autorelease]; + + [timer retain]; + objc_autoreleasePoolPop(pool); + + return [timer autorelease]; +} #ifdef OF_HAVE_BLOCKS + (instancetype)timerWithTimeInterval: (of_time_interval_t)timeInterval repeats: (bool)repeats block: (of_timer_block_t)block @@ -269,10 +325,11 @@ target: (id)target selector: (SEL)selector object: (id)object1 object: (id)object2 object: (id)object3 + object: (id)object4 arguments: (uint8_t)arguments repeats: (bool)repeats OF_METHOD_FAMILY(init) { self = [super init]; @@ -282,10 +339,11 @@ _target = [target retain]; _selector = selector; _object1 = [object1 retain]; _object2 = [object2 retain]; _object3 = [object3 retain]; + _object4 = [object4 retain]; _arguments = arguments; _repeats = repeats; _valid = true; #ifdef OF_HAVE_THREADS _condition = [[OFCondition alloc] init]; @@ -308,10 +366,11 @@ interval: interval target: target selector: selector object: nil object: nil + object: nil object: nil arguments: 0 repeats: repeats]; } @@ -325,10 +384,11 @@ return [self of_initWithFireDate: fireDate interval: interval target: target selector: selector object: object + object: nil object: nil object: nil arguments: 1 repeats: repeats]; } @@ -345,10 +405,11 @@ interval: interval target: target selector: selector object: object1 object: object2 + object: nil object: nil arguments: 2 repeats: repeats]; } @@ -366,13 +427,36 @@ target: target selector: selector object: object1 object: object2 object: object3 + object: nil arguments: 3 repeats: repeats]; } + +- initWithFireDate: (OFDate *)fireDate + interval: (of_time_interval_t)interval + target: (id)target + selector: (SEL)selector + object: (id)object1 + object: (id)object2 + object: (id)object3 + object: (id)object4 + repeats: (bool)repeats +{ + return [self of_initWithFireDate: fireDate + interval: interval + target: target + selector: selector + object: object1 + object: object2 + object: object3 + object: object4 + arguments: 4 + repeats: repeats]; +} #ifdef OF_HAVE_BLOCKS - initWithFireDate: (OFDate *)fireDate interval: (of_time_interval_t)interval repeats: (bool)repeats @@ -409,10 +493,11 @@ [_fireDate release]; [_target release]; [_object1 release]; [_object2 release]; [_object3 release]; + [_object4 release]; #ifdef OF_HAVE_BLOCKS [_block release]; #endif #ifdef OF_HAVE_THREADS [_condition release]; @@ -438,12 +523,13 @@ void *pool = objc_autoreleasePoolPush(); id target = [[_target retain] autorelease]; id object1 = [[_object1 retain] autorelease]; id object2 = [[_object2 retain] autorelease]; id object3 = [[_object3 retain] autorelease]; + id object4 = [[_object4 retain] autorelease]; - OF_ENSURE(_arguments <= 3); + OF_ENSURE(_arguments <= 4); if (_repeats && _valid) { int missedIntervals = -[_fireDate timeIntervalSinceNow] / _interval; of_time_interval_t newFireDate; @@ -485,10 +571,17 @@ [target performSelector: _selector withObject: object1 withObject: object2 withObject: object3]; break; + case 4: + [target performSelector: _selector + withObject: object1 + withObject: object2 + withObject: object3 + withObject: object4]; + break; } #ifdef OF_HAVE_BLOCKS } #endif @@ -536,15 +629,17 @@ [_target release]; [_object1 release]; [_object2 release]; [_object3 release]; + [_object4 release]; _target = nil; _object1 = nil; _object2 = nil; _object3 = nil; + _object4 = nil; } #ifdef OF_HAVE_THREADS - (void)waitUntilDone {