2011-12-31 107 views
0

我想要一个计时器类,可以发送消息到委托时有1/2/3秒去。iOS逻辑单元测试目标在单元测试通过NSTimer后崩溃

我的测试目标一直崩溃。

  • iOS逻辑单元测试目标。
  • 使用重复NSTimer测试持续时间的测试类
  • 一个没有声明的测试。测试通过,但随后的目标与崩溃:

/Developer/Tools/RunPlatformUnitTests.include: line 415: 770 Bus error "${THIN_TEST_RIG}" "${OTHER_TEST_FLAGS}" "${TEST_BUNDLE_PATH}"

在我看来,它是某种内存分配错误的,但我想不出什么我失踪。该问题与停止计时器程序有某种关联。只有当计时器耗尽时,目标才会崩溃。

事情我已经试过

  • 建立与分析 - 没有错误报告
  • 从连接标志删除-framework和UIKit
  • 删除的dealloc - 这没有任何影响

测试代码

-(void)testGivenThreeSecondDurationAtOneSecondDelegateShouldBeToldToShowGreenCard { 
    JGTimerController *timer = [JGTimerController timerWithDurationValue:1 delegate:nil]; 
    [timer startTimer]; 

    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:1.1]]; 
} 

类代码

@interface JGTimerController : NSObject { 
    NSNumber *duration; 
    NSTimer  *timer; 
    id <NSObject, JGTimerControllerDelegate> _delegate; 
} 
@property (nonatomic, retain) NSNumber *duration; 
... public methods... 
@end 


@implementation JGTimerController 

@synthesize duration; 

+(JGTimerController *)timerWithDurationValue:(NSUInteger)durationValue delegate:(id <JGTimerControllerDelegate>)delegate_ { 
    JGTimerController *instance = [[[JGTimerController alloc] initWithDurationValue:durationValue delegate:delegate_] autorelease]; 
    return instance; 
} 

-(JGTimerController *)initWithDurationValue:(NSUInteger)durationValue delegate:(id <JGTimerControllerDelegate>)delegate_ { 
    self = [super init]; 
    timer = nil; 
    [self setDurationValue:durationValue]; 
    _delegate = delegate_; 
    return self; 
} 

-(NSUInteger)durationValue { 
    NSNumber *result = [self duration]; 
    return result ? [result intValue] : 0; 
} 

-(void)setDurationValue:(NSUInteger)value_ { 
    [self setDuration:[NSNumber numberWithInt:value_]]; 
} 

-(BOOL)stopTimerAtZeroDuration:(NSTimer *)timer_ { 
    if ([self durationValue] == 0) { 
     [self stopTimer]; 
     return YES; 
    } 
    return NO; 
} 

-(void)startTimer { 
    if ([self stopTimerAtZeroDuration:nil]) 
     return; 

    timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timerDidCountDownByASecond:) userInfo:nil repeats:YES]; 
} 

-(void)stopTimer { 
    if ([self durationValue] == 0 && [_delegate conformsToProtocol:@protocol(JGTimerControllerDelegate)]) 
     [_delegate showRedCard]; 

    [timer invalidate]; 
    [timer release]; 
} 

-(BOOL)timerIsRunning { 
    return (timer != nil); 
} 

-(void)timerDidCountDownByASecond:(NSTimer *)timer_ { 
    [self setDurationValue:[self durationValue] - 1]; 
    [self stopTimerAtZeroDuration:timer_]; 
} 

-(void)dealloc { 
    [_delegate release]; 
    [timer release]; 
    [duration release]; 
    [super dealloc]; 
} 

@end 

回答

1

同样,定时器不应该被释放。 NSTimer与其他NSObject一样,如果您没有分配,复制或保留,则不需要释放。

+0

我很肯定我试图消除[定时发布]线,它仍然坠毁。但删除了这个,嘿presto!有效。非常感谢! – 2011-12-31 09:33:08

2

应该没有[_delegate release]dealloc因为你没有保留。