2013-12-20 218 views
-1

對這個主題做了一些研究,但仍然沒有得到它。NSTimeInterval始終爲0

使用[NSDate timeIntervalSinceDate:NSDate]時,NSTimeInterval始終爲0。

例子。

- (NSNumber*) elapsed 
    { 
    __block NSDate* currentDate; 
    dispatch_async(dispatch_get_main_queue(), 
     ^{ 
     currentDate = [NSDate date]; 
     }); 
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.transactionStartedAt]; 
    _elapsed = @(timeInterval*1000); 
    return _elapsed; 
    } 

你可以看到我用dispatch_async主隊列,因爲此getter屬性從後臺排隊訪問,並且[NSDate的日期]返回nil,我這是怎麼想通解決這個問題。

然後,您可以看到我正在查找時間間隔並將其轉換爲兩個日期之間的毫秒數。

編輯:用此代碼解決時間間隔問題。

- (NSNumber*) elapsed 
    { 
    NSDate* currentDate = [NSDate date]; 
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.transactionStartedAt]; 
    NSLog(@"TimeInterval: %f", timeInterval); 
    return @(timeInterval*1000); 
    } 

這實際上是在對象的吸氣劑,所以如果我更改代碼以

- (NSNumber*) elapsed 
    { 
    NSDate* currentDate = [NSDate date]; 
    NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.transactionStartedAt]; 
    NSLog(@"TimeInterval: %f", timeInterval); 
    return _elapsed = @(timeInterval*1000); 
    } 

我得到EXC_BAD_ACCESS致命的異常。

我想我有問題,從另一個背景隊列中更改對象的創建!

問候。

+0

爲什麼選擇GCD? 'dispatch_get_main_queue(), ^ { currentDate = [NSDate date]; });' –

+0

這是另一個stackoverflow後的完美問題,但我也提到它。因爲一個原因,如果我不這樣做與GCD我得到[NSDate日期]零價值!瘋狂我知道。 –

+0

[NSDate date]有一個隱式autorelease,不是? – Larme

回答

2

所以這個問題是當你使用dispatch_async代碼被調用的下一個運行循環迴路的塊獲取

NSTimeInterval timeInterval = [currentDate timeIntervalSinceDate:self.transactionStartedAt]; 
_elapsed = @(timeInterval*1000); 
return _elapsed; 
} 

後調用。嘗試調試此方法,看看我的意思

+0

是的,我明白了。嗯,那麼我的問題是,當我試圖通過[NSDate date]獲取當前日期時,我得到一個零。 –

+0

@TaskosGeorge我想你的問題是在調試。從'[NSDate date]'獲得'nil'不太可能。 – Sulthan

+0

好的,我解決了我的問題,謝謝你的回答,確實有幫助。 –

3

當您撥打timeIntervalSinceDate,currentDate是UNDEFINED(尚未分配)。我猜在這種情況下,編譯器決定使它成爲nil。並且調用nil對象上的方法(發送消息)始終返回0.

異步分派塊使塊有時會在稍後執行,在此情況下可能在方法返回後執行。在這種情況下,它可能會對內存做一些非常糟糕的事情,因爲它將分配給堆棧上已經無效的變量。

+0

我明白你的意思了。現在我刪除了GCD,我認爲無論如何這都是壞的,並且我正確地獲得了時間間隔。現在我實現了屬性的getter,並在您看到生成的_elapsed字段時設置,並在返回值時獲得BAD_EXC。如果我只是返回timeinterval值,它工作正常。我只想清楚爲什麼我得到BAD_EXC。有什麼想法嗎? –

+0

您將不得不再次分享您的代碼。但是,你的代碼有點奇怪。你有一個實際上改變你的對象的getter(分配到'_elapsed')。那麼,誰知道還有什麼事情發生。 – Sulthan

+0

我實際上改變_elapsed值。編輯了這個問題。 –