簡體   English   中英

NSDate保留發送到解除分配實例的消息

[英]NSDate retain message sent to deallocated instance

我在使用NSDate時遇到了一些問題並將其保存在NSUserDefaults中。 它接縫NSUserDefaults每隔一次保存我的NSDate,它不能因為它被解除分配並在日志中顯示此錯誤。

-[__NSDate retain]: message sent to deallocated instance 0x4c20c80

我知道NSDate以與普通對象不同的方式分配和釋放,但我想知道是否有人知道是否通過使用:

- (void)saveData
{
NSUserDefaults *data = [NSUserDefaults standardUserDefaults];
[data setObject:dateOpened forKey:@"dateOpened"];
[dData synchronize];
}

...要么...

- (void)loadData
{
NSUserDefaults *data = [NSUserDefaults standardUserDefaults];
dateOpened = [data objectForKey:@"dateOpened"];
}

我發布我的NSDate實例,所以給它一個保留計數為0所以我的應用程序在嘗試時不能再保存它?

我在用:

@property (retain) NSDate *dateOpened;

任何想法都會非常感激,因為我想要解決這個問題。 我只學了大約4個月左右的時間,我已經完成了我的第一個應用程序,這是一個主要的扳手!

非常感謝,如果您需要更多關於我正在做的事情的代碼或信息,請告訴我。 :-D

就內存管理而言,NSDate與任何其他對象的行為沒有任何不同。 你可能指的是,通常使用像[NSDate date]這樣的便利操作符返回一個自動釋放的對象(意味着該對象將在主循環結束時刪除(或者每當釋放自動釋放池時),除非另一個類調用保留在它上面。由於我看不到你的所有代碼,我只能做出有根據的猜測,但我相信你正在調用從[data objectForKey:]返回的對象的釋放,這將是你的錯誤。該函數返回一個自動釋放的對象,因此你沒有對象的“所有權”,直到你在它上面調用retain。如果你沒有調用retain,或者顯式地分配它,你就不應該在它上面調用release(這適用於所有對象) )。

您遇到的問題是在您的-loadData方法中。

dateOpened = [data objectForKey:@"dateOpened"];

如果是上面的那一行,你是直接訪問ivar而不是通過將要保留的屬性。 所以你有兩個選擇之一。

// First choice retain it yourself
dateOpened = [data objectForKey:@"dateOpened"];
[dateOpened retain];

要么

// Second choice have the @property do it for you
[self setDateOpened:[data objectForKey:@"dateOpened"]];

這就是為什么在您的私人ivars上使用下划線是個好主意,這樣您就可以知道何時直接訪問它們。 你將犯很少的錯誤。 :)

// declaring it with underscore would have caught your mistake.
NSDate *_dateOpened;

loadData的問題是您直接將dateOpened分配給自動釋放的值,一旦事件循環通過,該值將無效。

- (void)loadData
{
NSUserDefaults *data = [NSUserDefaults standardUserDefaults];

// dateOpened = [data objectForKey:@"dateOpened"];

// try:
   self.dateOpened = [data objectForKey:@"dateOpened"];

// which is basically the same as:
// [self setDateOpened:[data objectForKey:@"dateOpened"]];

// the following 2 lines could also work:
// [dateOpened release];
// dateOpened = [[data objectForKey:@"dateOpened"] retain];

}

如果你有@synthesized dateOpened ,那么你可以想象你的類中添加了以下兩種方法:

- (NSDate *)dateOpened {
  return dateOpened;
}

- (void)setDateOpened:(NSDate *)aDate {
  [aDate retain];
  [dateOpened release];
  dateOpened = aDate;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM