NSDate 因连续操作而崩溃

Posted

技术标签:

【中文标题】NSDate 因连续操作而崩溃【英文标题】:NSDate crash with successive actions 【发布时间】:2009-06-14 04:07:19 【问题描述】:

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

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

下面是崩溃的方法:

(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;

【问题讨论】:

【参考方案1】:

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

初始化实例时,使用:

today = [[NSDate date] retain];

我会将最后一行更改为:

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

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

[today release];

在调用 [super dealloc] 之前;

【讨论】:

而不是today = [[NSDate date] retain];,最好是:today = [[NSDate alloc] init];,这样就不必进行自动释放【参考方案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(或其同伴之一),则通常是内存管理错误。

【讨论】:

【参考方案3】:

也许你需要说

today = [[NSDate date] retain]

【讨论】:

【参考方案4】:

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

【讨论】:

以上是关于NSDate 因连续操作而崩溃的主要内容,如果未能解决你的问题,请参考以下文章

更新到 sdk 版本 23 后,我的应用程序因一些浮动操作按钮错误而崩溃?

线程因互斥锁而崩溃

线程:PyQt 因“出队时队列中的未知请求”而崩溃

应用程序因 AVAudioSession privateBeginInterruption 而崩溃

iOS:当应用程序因任何崩溃而退出时,是不是有任何委托方法

QML 状态机因信号而崩溃