【问题标题】:NSDate crash with successive actionsNSDate 因连续操作而崩溃
【发布时间】: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;
}

【问题讨论】:

    标签: ios objective-c nsdate


    【解决方案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 对象。您可能还需要今天发布,然后才能完成最后的作业。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-13
          • 2013-03-09
          • 2015-12-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多