2011-05-10 50 views
0

我在写一个有多个视图的程序。我想在视图之间传递一个日期变量。我用extern NSDate *chooseDate做了一个全局变量。我在其中一个视图上声明变量NSDate *date。然后我设置date = chooseDate。然后我使用下面的代码来添加日期;NSdate的问题

NSDateComponents *components = [[NSDateComponents alloc] init]; 
[components setDay:(int)daycount]; 
date = [calendar dateByAddingComponents:components toDate:date options:0]; 

这个问题似乎是chooseDate没有被确认为NSDate。该代码崩溃在date = [calendar ...]。我为此感到不知所措。我希望我已经解释清楚。有任何想法吗?

+0

你可以显示你的财产(?)'日期'的代码? – FreeAsInBeer 2011-05-10 00:20:00

+0

date = chooseDate; \t \t NSDateComponents * components = [[NSDateComponents alloc] init]; [components setDay:(int)daycount]; date = [calendar dateByAddingComponents:components toDate:date options:0]; \t dateComponents = [日历组件:unitFlags fromDate:date]; year = [dateComponents year]; month = [dateComponents month]; day = [dateComponents day]; 小时= [dateComponents小时]; min = [dateComponents minute]; \t NSDateFormatter * formatter = [[[NSDateFormatter alloc] init] autorelease]; [formatter setDateStyle:NSDateFormatterLongStyle]; [showDate setText:[formatter stringFromDate:date]]; – tombuarts 2011-05-10 00:55:36

+0

对不起,格式。我不记得如何让它看起来像目标c中的代码。 – tombuarts 2011-05-10 00:57:34

回答

0

如果将chooseDate = [datePicker date];更改为chooseDate = [[datePicker date] copy];,可能会有效。如果是这样,其余的应该是非常自我解释。

+0

对不起,迟到了,我已经离开了一段时间。如您所述使用“复制”解决了问题,非常感谢。在过去我使用过的所有不同类型的编码中,设置一个变量等于另一个变量总是导致变量的精确副本(即choosedate = date,当两者都定义为NSDate时)。这只是复制日期的问题,或者在设置一个变量等于另一个变量时总是使用“复制”? – tombuarts 2011-05-17 00:44:30

+0

问题是,'[datePicker date]'返回一个autorelease对象,这意味着当它被调用的方法闭包结束时,对象被释放。当你尝试在'date = [calendar dateByAddingComponents:components toDate:date options:0]中调用它时''日期指针指向null或者内存地址被分配给一个不同的对象,因此你得到的错误并不总是一个简单的崩溃,有时你也会在堆栈中得到一些奇怪的消息。 至于'copy',它所做的是确保即使原始对象被释放,您仍然拥有该副本并可以使用它。 – 2011-05-17 07:49:33

+0

谢谢,解释有帮助。我在堆栈中收到奇怪的消息,我不知道该怎么做。 – tombuarts 2011-05-18 00:04:04

0

您正在将chooseDate设置为autoreleased实例。你确定它存在,当你尝试使用它?你可能需要retain吧。

+0

我查过了。当我设置“date = chooseDate”时它肯定存在。当我删除代码行“日期= [日历..]”程序运行良好。 – tombuarts 2011-05-10 00:15:32