我对 Objective-C 内存管理相当陌生,虽然我认为我理解它,但我有一个我无法设法解决的问题。
我有这个属性:
@property (nonatomic, retain) NSDate *dateDisplayed;
我在 viewDidLoad 中使用自定义方法分配:
self.dateDisplayed = [self dbDateFormatToNsDate:@"15/11/2011"];
我的 dbDateFormatToNsDate
方法如下所示:
- (NSDate *) dbDateFormatToNsDate:(NSString *) date {
NSDateFormatter *d = [[NSDateFormatter alloc] init];
[d setDateFormat:@"dd/MM/yyyy"];
NSDate *toReturn = [d dateFromString:date];
[d release];
return toReturn;
}
所以它返回一个自动释放的对象(如果 NSDate 遵循约定)。但是当我从 viewDidLoad
中退出时,在另一个试图读取 dateDisplayed
的函数中:
[dateDisplayed isEqualToDate:[self dbDateFormatToNsDate:@"15/11/2011"]]
我得到一个 NSZombie 异常。感谢您的帮助!
最佳答案
当使用 self.property 赋值时,属性会被保留,因为调用了 setter 方法,但如果只是赋值而不使用 self.
,则不会。当然假设您在 .h 文件的属性定义中有 retain
。
你可以 [d autorelease];
代替。我可能完全不同意这一点,但是 toReturn
NSDate 可能需要保留格式化程序,即使在您发布它之后,也会导致访问错误:
尝试:
- (NSDate *) dbDateFormatToNsDate:(NSString *) date {
NSDateFormatter *d = [[NSDateFormatter alloc] init];
[d setDateFormat:@"dd/MM/yyyy"];
NSDate *toReturn = [d dateFromString:date];
[d autorelease];
return toReturn;
}
关于ios - 保留属性(property)被重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7682672/