Iphone 日期问题
我有以下代码: 在Iphone 日期问题,iphone,objective-c,xcode,ios,nsdate,Iphone,Objective C,Xcode,Ios,Nsdate,我有以下代码: 在viewDidLoad中: dateForView = [[NSDate alloc] init]; (dateForView is a NSDate) 和一个IBAction: - (IBAction) addDay{ NSLog(@"dateforview1:%@", dateForView); dateForView = [dateForView dateByAddingTimeInterval:60*60*24*1]; NSDateFormat
viewDidLoad
中:
dateForView = [[NSDate alloc] init]; (dateForView is a NSDate)
和一个IBAction:
- (IBAction) addDay{
NSLog(@"dateforview1:%@", dateForView);
dateForView = [dateForView dateByAddingTimeInterval:60*60*24*1];
NSDateFormatter *formatter =[[[NSDateFormatter alloc] init] autorelease];
[formatter setDateFormat:@"dd/MM/yyyy"];
[dataLabel setText:[formatter stringFromDate:dateForView]];
}
当我按下一个连接到此iAction的按钮时,第一次一切正常,但下一次就会崩溃。这是控制台崩溃的结果:
2011-06-01 11:29:55.238 Prenotazioni[554:707] dateforview1:(
"<UIControlTargetAction: 0x1962d0>"
)
2011-06-01 11:29:55.246 Project[554:707] -[__NSArrayI dateByAddingTimeInterval:]: unrecognized selector sent to instance 0x1ba680
2011-06-01 11:29:55.264 Project[554:707] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI dateByAddingTimeInterval:]: unrecognized selector sent to instance 0x1ba680'
2011-06-01 11:29:55.238 Prenotazioni[554:707]日期查看1:(
""
)
2011-06-01 11:29:55.246项目[554:707]-[\uu NSArrayI dateByAddingTimeInterval:]:发送到实例0x1ba680的无法识别的选择器
2011-06-01 11:29:55.264项目[554:707]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSArrayI dateByAddingTimeInterval::]:未识别的选择器发送到实例0x1ba680'
在viewDidLoad
中,您将获得一个NSDate
,您为其保存了一个引用(因为您使用init
创建了它)。第一次运行addDay
时,将其替换为自动删除的NSDate
,您不再持有该日期的引用。当您离开addDay
时,此对dateForView
的引用将无效,下次您输入addDay
并尝试递增时,您的应用程序将崩溃。解决办法是:
dateForView
成为具有retain
策略的属性viewDidLoad
中使用self.dateForView=[NSDate date]
self.dateForView=[self.dateForView dateByAddingTimeInterval:60*60*24*1]
中的addDay
另外,不要忘记在析构函数中设置
self.dateForView=nil
,以避免内存泄漏。在viewdiload
中,您将获得一个NSDate
,您将为其保存一个引用(因为您是使用init
创建它的)。第一次运行addDay
时,将其替换为自动删除的NSDate
,您不再持有该日期的引用。当您离开addDay
时,此对dateForView
的引用将无效,下次您输入addDay
并尝试递增时,您的应用程序将崩溃。解决办法是:
dateForView
成为具有retain
策略的属性viewDidLoad
中使用self.dateForView=[NSDate date]
self.dateForView=[self.dateForView dateByAddingTimeInterval:60*60*24*1]
中的addDay
另外,不要忘记在析构函数中设置self.dateForView=nil,以避免内存泄漏。可能是因为dateForView被释放。要解决此问题,请使用[dateForView retain];但这将增加内存可能是因为dateForView被释放。要解决此问题,请使用[dateForView retain];但是这会增加内存我已经执行了你的代码 您必须更改此行:-
NSDateFormatter *formatter =[[[NSDateFormatter alloc] init] autorelease];
to
NSDateFormatter *formatter =[[NSDateFormatter alloc] init];
and at last
[formatter release];
like:-
- (IBAction) addDay{
NSLog(@"dateforview1:%@", dateForView);
dateForView = [dateForView dateByAddingTimeInterval:60*60*24*1];
NSDateFormatter *formatter =[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"dd/MM/yyyy"];
[dataLabel setText:[formatter stringFromDate:dateForView]];
[formatter release];
}
我已经执行了你的代码 您必须更改此行:-
NSDateFormatter *formatter =[[[NSDateFormatter alloc] init] autorelease];
to
NSDateFormatter *formatter =[[NSDateFormatter alloc] init];
and at last
[formatter release];
like:-
- (IBAction) addDay{
NSLog(@"dateforview1:%@", dateForView);
dateForView = [dateForView dateByAddingTimeInterval:60*60*24*1];
NSDateFormatter *formatter =[[NSDateFormatter alloc] init];
[formatter setDateFormat:@"dd/MM/yyyy"];
[dataLabel setText:[formatter stringFromDate:dateForView]];
[formatter release];
}
如果您决定这样做,还必须在
addDay
中释放上一个dateForView
值,否则应用程序将泄漏内存。如果您决定这样做,还必须在addDay
中释放上一个dateForView
值,否则应用程序将泄漏内存。self.dateForView=nil?或者Dealoc中的[dateforView release],否?任何一个都可以;当我有一个与实例变量对应的属性时,我通常使用self.dateForView=nil
。如果可以避免,就不应该在dealoc中使用属性。如果存在一个显式声明的实例变量,请释放该实例变量。self.dateForView=nil?或者Dealoc中的[dateforView release],否?任何一个都可以;当我有一个与实例变量对应的属性时,我通常使用self.dateForView=nil
。如果可以避免,就不应该在dealoc中使用属性。如果有显式声明的实例变量,请释放该实例变量。@blackguardian执行一次代码,因为我没有遇到任何崩溃我还有一件事你在视图控制器的其他地方使用dateForView。@blackguardian执行一次代码,因为我没有遇到任何崩溃我还有一件事你在视图控制器的其他地方使用dateForView吗您的视图控制器。考虑与您的问题无关的一个问题。简单地将86400秒添加到一个日期可能不是添加一天的正确答案,因为它不适合DST更改。您可能应该使用NSDateComponents我知道nsdatecomponent,但是在我无法与nsdate进行比较之后,您是否阅读了我提供的链接?创建表示一天的NSDATE组件,然后使用NSCalendar
将其添加到dateForView
<代码> DeaFoVIEW 仍然是<代码> NDATE < /代码>。考虑与您的问题无关的一个问题。简单地将86400秒添加到一个日期可能不是添加一天的正确答案,因为它不适合DST更改。您可能应该使用NSDateComponents我知道nsdatecomponent,但是在我无法与nsdate进行比较之后,您是否阅读了我提供的链接?创建表示一天的NSDATE组件,然后使用NSCalendar
将其添加到dateForView
dateForView
仍然是一个NSDate
。