2

我对 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 异常。谢谢你的帮助!

4

2 回答 2

1

使用 self.property 进行分配时,该属性会保留,因为调用了 setter 方法,但仅在不使用self.它的情况下进行分配时则不会。当然,假设您retain在 .h 文件的属性定义中。


你可以[d autorelease];改为。我可能对此完全不屑一顾,但toReturnNSDate 可能需要在您发布格式化程序之后保留它,从而导致访问错误:

尝试:

- (NSDate *) dbDateFormatToNsDate:(NSString *) date {
    NSDateFormatter *d = [[NSDateFormatter alloc] init];
    [d setDateFormat:@"dd/MM/yyyy"];
    NSDate *toReturn = [d dateFromString:date];
    [d autorelease];
    return toReturn;
}
于 2011-10-07T03:15:07.390 回答
0

由于您返回的对象是由不以 alloc、copy、mutableCopy 开头的方法创建的,因此约定说您应该自动释放它。

自动释放意味着它将在未来发布。如果方法的调用者需要它留下来,那么他们将保留它。

阅读内存管理指南:

http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html

这是规则:

1 & 3 适用于该方法。2 适用于可能需要持有它的调用类。

1 - 您拥有您创建的任何对象 您 使用名称以“alloc”、“new”、“copy”或“mutableCopy”开头的方法创建对象(例如,alloc、newObject 或 mutableCopy)。

2 - 您可以使用retain 获得对象的所有权 接收到的对象通常保证在接收到它的方法中保持有效,并且该方法也可以安全地将对象返回给它的调用者。你在两种情况下使用retain:(1)在访问器方法或init方法的实现中,获取你想要存储的对象的所有权作为属性值;(2) 防止对象因某些其他操作的副作用而失效(如“避免导致正在使用的对象的释放”中所述)。

3 - 当您不再需要它时,您必须放弃您拥有的对象 的所有权 您通过向对象发送释放消息或自动释放消息来放弃对象的所有权。因此,在 Cocoa 术语中,放弃对象的所有权通常称为“释放”对象。

4 - 您不得放弃您不拥有的对象的所有权 这只是先前政策规则的推论,明确说明。

于 2011-10-07T03:17:10.553 回答