为什么我需要保留NSDateFormatter dateFromString的结果:

时间:2011-11-11 00:04:44

标签: objective-c ios nsdate nsdateformatter retain

我有一个NSDate *,我将其存储为具有retain关键字的属性:

@property (nonatomic, retain) NSDate* startTime;

我按如下方式使用它:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"h:mm a"];
startTime = (NSDate*)[[NSUserDefaults] standardUserDefaults] objectForKey:@"StartTimeKey"];
if (startTime == nil)
  startTime = [[dateFormatter dateFromString:@"8:00 am"] retain];

为什么我需要保留dateFromString:消息的结果,但我不需要保留objectForKey:的结果?

我刚刚升级到XCode 4.2,现在我正在使用LLVM GCC 4.2编译器。在升级之前,代码在没有保留的情况下工作正常。现在它在没有保留消息的情况下崩溃(后来我访问startDate属性的代码)。

2 个答案:

答案 0 :(得分:4)

问题在于你写了这个:

startTime = blah blah blah;

您正在直接设置实例变量startTime。如果你这样做:

self.startTime = blah blah blah;

然后编译器会把它变成这个:

[self setStartTime:blah blah blah];

并且自动生成的setter方法将为您执行保留。

如果你这样做:

@synthesize startTime = _startTime;

然后实例变量将被命名为_startTime,这使得更容易记住使用属性而不是直接分配给实例变量。

答案 1 :(得分:1)

答案在第11页的“内存管理编程指南”中。

您拥有自己创建的对象(即您不需要保留它,已经完成了)。使用alloc,new,copy或mutablecopy创建一个对象。

在这种情况下,dateFormatter为您提供了一个新对象,但由于您没有自己调用alloc,new或copy,因此dateFormatter将在新的NSDAte对象上调用(通常是它的工作原理)autorealease。

但是,如果您使用setter和getter设置属性,则不会出现此问题。