Index: src/OFTimer.m ================================================================== --- src/OFTimer.m +++ src/OFTimer.m @@ -352,29 +352,44 @@ return [_fireDate compare: timer->_fireDate]; } - (void)fire { + void *pool = objc_autoreleasePoolPush(); + id target = [[_target retain] autorelease]; + id object1 = [[_object1 retain] autorelease]; + id object2 = [[_object2 retain] autorelease]; + OF_ENSURE(_arguments <= 2); + + if (_repeats && _valid) { + OFDate *old = _fireDate; + _fireDate = [[OFDate alloc] + initWithTimeIntervalSinceNow: _interval]; + [old release]; + + [[OFRunLoop currentRunLoop] addTimer: self]; + } else + [self invalidate]; #ifdef OF_HAVE_BLOCKS if (_block != NULL) _block(self); else { #endif switch (_arguments) { case 0: - [_target performSelector: _selector]; + [target performSelector: _selector]; break; case 1: - [_target performSelector: _selector - withObject: _object1]; + [target performSelector: _selector + withObject: object1]; break; case 2: - [_target performSelector: _selector - withObject: _object1 - withObject: _object2]; + [target performSelector: _selector + withObject: object1 + withObject: object2]; break; } #ifdef OF_HAVE_BLOCKS } #endif @@ -387,19 +402,11 @@ } @finally { [_condition unlock]; } #endif - if (_repeats && _valid) { - OFDate *old = _fireDate; - _fireDate = [[OFDate alloc] - initWithTimeIntervalSinceNow: _interval]; - [old release]; - - [[OFRunLoop currentRunLoop] addTimer: self]; - } else - [self invalidate]; + objc_autoreleasePoolPop(pool); } - (OFDate*)fireDate { OF_GETTER(_fireDate, true) @@ -429,11 +436,15 @@ - (void)invalidate { _valid = false; [_target release]; + [_object1 release]; + [_object2 release]; _target = nil; + _object1 = nil; + _object2 = nil; } - (bool)isValid { return _valid;