iOS:日期问题

时间:2011-06-01 09:30:53

标签: 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];
    NSDateFormatter *formatter =[[[NSDateFormatter alloc] init] autorelease];
    [formatter setDateFormat:@"dd/MM/yyyy"];
    [dataLabel setText:[formatter stringFromDate:dateForView]];
}

当我按下连接到这个IBAction的按钮时,第一次就可以了,但是下次再次崩溃。这是控制台崩溃的结果:

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'

3 个答案:

答案 0 :(得分:3)

viewDidLoad中,您获得了一个NSDate,您持有一个引用(因为您使用init创建了它)。第一次运行addDay时,您可以将其替换为不再拥有引用的自动释放NSDate。当您离开addDay时,对dateForView的引用将变为无效,下次您输入addDay并尝试递增时,您的应用就会崩溃。解决方案是:

  1. 使用dateForView政策
  2. 制作retain个媒体资源
  3. self.dateForView = [NSDate date]。{/ li>中使用viewDidLoad
  4. self.dateForView = [self.dateForView dateByAddingTimeInterval:60*60*24*1]。{/ li>中使用addDay

    另外,不要忘记在析构函数中设置self.dateForView = nil以避免内存泄漏。

答案 1 :(得分:0)

可能是dateForView发布。为了解决这个问题,请使用[dateForView retain];在ibaction.But这将增加内存

答案 2 :(得分:0)

我已经执行了你的代码

你必须改变这一行: -

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

}