2012-03-27 46 views
1

我正在研究需要逐秒更新的iOS应用程序(FW:5.0+ & ARC)。NSRunLoop在模拟器上正常工作,崩溃iDevice

目前,我有这样的方法中的(这被称为在performSelector时-viewDidLoad):

-(void)FireOnload { 
counter = [NSTimer timerWithTimeInterval:1.0 target:self selector:@selector(countDownTime) userInfo:nil repeats:YES]; 
[counter fire]; 
[[NSRunLoop mainRunLoop] addTimer:counter forMode: NSDefaultRunLoopMode]; // <-- Causing Problem 
} 

-(void)countDownTime 
{ 
double timeNow = [[NSDate date] timeIntervalSince1970]; 
double timeLeft = timeEnding - timeNow; 

if(timeLeft < 60) // Less then 60 seconds, do something. 
{ 
    //Do Stuff 
} 

} 

counter变量称为在头部为的NSTimer。 我明确地调用[counter fire],因此只要加载视图就会调用它,而不是在1秒之后。

这在iOS模拟器中正常工作并会每秒触发,但是当它进入iDevice时,它会崩溃。

我已经注释掉了NSRunLoop行,并且iDevice不会崩溃。但是,它不再每秒更新一次。

我在这里做错了什么?

感谢

+0

崩溃时的堆栈跟踪是什么?另外,你提到你使用'performSelector'调用'FireOnload' - 你在调用主线程还是背景? – FluffulousChimp 2012-03-27 03:02:35

+2

那么这不会解决实际问题,但如果您要立即将计时器放在runloop上,还可以使用scheduledTimerWithTimeInterval:并且不要手动将它放在runloop上。 – 2012-03-27 05:23:47

回答

0

发现了问题:

改变:

@property (weak, nonatomic) NSTimer *counter;

到:

@property (strong, nonatomic) NSTimer *counter;

如果你不使用ARC,那么你就需要更换strongretain

0

你说你用performSelector调用FireOnLoad。为什么?如果你在后台线程上调用它,你需要知道NSRunLoop不是线程安全的,所以除了主线程外,你不应该访问主runloop。

相关问题