我有一个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属性的代码)。
答案 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设置属性,则不会出现此问题。