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 后,我的应用程序因一些浮动操作按钮错误而崩溃?