2010-08-30 75 views
0

我有我在我的iPhone應用程序的主線程中使用,我也從後臺線程,它的定義是這樣引用它一個NSDate對象:想不通爲什麼我的目標是得到釋放

//header 
NSDate *currentDate; 
@property (nonatomic, retain) NSDate *currentDate; 

//implementation file 
@synthesize currentDate; 

然後,在我的應用程序,我把它傳遞該對象到另一個助手類refreshData方法來獲得來自遠程服務的一些數據:

- (void) reloadData: (NSInvocationOperation*)operation 
{ 
    //... 
    NSMutableArray *results = [managerHelper refreshForAddress: address 
                 timeFrom: fromDate 
                 timeTo: self.currentDate]; 
    //... 
} 

(注意上面的調用是在後臺線程)

現在,在一側的輔助類,我已經添加了這些行

- (NSMutableArray*) refreshForAddress:(NSString *)address 
          timeFrom:(NSDate*) fromDate 
           timeTo:(NSDate*) toDate 
{ 
    debugLog(@"retain count: %i", [toDate retainCount]); 
    NSNumber *toTimeNumber = [[NSNumber alloc] initWithDouble: [toDate timeIntervalSince1970]*1000]; 
    debugLog(@"after retain count log"); 
} 

,但我得到了經典的錯誤: 「*** - [__ NSDate的timeIntervalSince1970]:發送到釋放實例0x71beea0消息」

而且記錄說:

MyApp的[5487:7903]保持數:2 MyApp的[5487:7903] *** - [__ NSDate的timeIntervalSince1970]:消息發送到釋放實例0x71beea0

所以,你可以看到最後的日誌狀態nt不會被調用,但retainCount是2,如何在日誌調用後出現錯誤時發生這種情況?

+1

你能告訴我們,你如何初始化'currentDate'變量? – 2010-08-30 06:21:07

+0

像這樣:self.currentDate = [NSDate date]; – Mark 2010-08-30 06:26:46

+1

忽略'retainCount'。它永遠不應該被依賴,並且只存在於2010年,因爲遺留原因。 – 2010-08-30 06:32:57

回答

1

你說你使用兩個或多個線程。 所以,你應該定義屬性如下方式,

@property (retain) NSDate *currentDate; ///< atomic default 

這樣將保證線程安全的該屬性。

編輯:

取下@屬性的「非原子」,它會表現爲在默認情況下一個原子操作。原子操作將保證線程安全的行爲。

+0

你的意思是「保留」嗎?或reatin? – Mark 2010-08-30 09:40:35

+0

也,這會解釋我得到的問題? – Mark 2010-08-30 09:44:39

+0

對不起,我輸入了錯誤。我的意思是「保留」,而不是「非原子」。 我認爲你有主線程和後臺線程。所以,如果兩個線程會使用這個屬性,我認爲保證線程安全是很重要的。 – AechoLiu 2010-08-30 10:38:10

1

你初始化NSDate的方式返回一個autorelease實例,它將自動分配到事件循環的結尾。使用[[NSDate date] retain],不要忘記手動釋放它。

+1

'self.currentDate = ...'保留對象 – tobiasbayer 2010-08-30 08:43:52

相關問題