3

我在下面有以下代码,旨在将名为“today”的类变量向前或向后更改一天。它会工作一次,但之后它会崩溃。无论我按左键还是右键,它都会做同样的事情。我究竟做错了什么?

今天的 var 是一个以 .. 开头的类 vartoday = [NSDate date]

这是崩溃的方法:

(IBAction)changeDateByOne:(id)sender{

    NSDate *newDay;
    NSDate *currentDay = today;

    NSTimeInterval secondsPerDay = 24 * 60 * 60;

    if(sender == leftButton){
         newDay = [currentDay addTimeInterval:-secondsPerDay];

    }else if(sender == rightButton) { 
         newDay = [currentDay addTimeInterval: secondsPerDay];
    }

    today = newDay;
}
4

4 回答 4

9

您不仅需要保留创建日期,还需要释放“今天”持有的现有值,否则您将泄露旧的引用。

初始化实例时,使用:

today = [[NSDate date] retain];

我会将最后一行更改为:

[today release];
today = [newDay retain];

最后,在您的 dealloc 方法中,添加:

[today release];

在调用 [super dealloc] 之前;

于 2009-06-14T04:28:30.977 回答
2

您需要阅读内存管理文档。就在这里:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

如果您要增加或减少天数,您可能需要阅读此内容,这是做同样事情的另一种方法:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/DatesAndTimes/Articles/dtCalendricalCalculations.html#//apple_ref/doc/uid/TP40007836-SW1

最后,如果发生崩溃,查看后面的痕迹通常会很有帮助(如果您自己无法弄清楚,请将它们包含在您的问题中)。如果您在跟踪中看到 objc_msgSend(或其同伴之一),则通常是内存管理错误。

于 2009-06-14T07:44:03.333 回答
1

也许你需要说

today = [[NSDate date] retain]
于 2009-06-14T04:14:53.147 回答
1

我认为您需要保留从 addTimeInterval 方法返回的 newDay 对象。您可能还需要今天发布,然后才能完成最后的作业。

于 2009-06-14T04:15:13.460 回答