[英][__NSDate timeIntervalSinceNow]: message sent to deallocated instance
[英]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.