我有这段代码:
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'
答案 0 :(得分:3)
在viewDidLoad
中,您获得了一个NSDate
,您持有一个引用(因为您使用init
创建了它)。第一次运行addDay
时,您可以将其替换为不不再拥有引用的自动释放NSDate
。当您离开addDay
时,对dateForView
的引用将变为无效,下次您输入addDay
并尝试递增时,您的应用就会崩溃。解决方案是:
dateForView
政策retain
个媒体资源
self.dateForView = [NSDate date]
。{/ li>中使用viewDidLoad
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];
}