2011-04-09 54 views
2

我有一个视图控制器,离开堆栈后,泄漏仪器显示内存泄漏。在阅读了大量有关the NSDateFormatter bug的帖子,并执行了setDateFormat 'Z' workaround之后,我仍然在泄漏内存(根据Instruments)。iOS:NSDateFormatter内存泄漏/ viewDidUnload

在我的头:

NSDateFormatter *dfm; 
... 
@property (nonatomic, retain) NSDateFormatter *dfm; 

我在执行:

@synthesize dfm; 
... 
- (void) viewDidLoad { 
    [super viewDidLoad]; 
    dfm = [[NSDateFormatter alloc] init]; 
    [self.dfm setDateFormat:@"h:mma Z"]; // leaks with & without this line 
} 
... 
- (void)viewDidUnload { 
    //SOLUTION: This method was never being called. Needed to use dealloc, per the answer below. 
    [dfm release]; 
    self.dfm = nil; 
    [super viewDidUnload]; 
} 

任何立场不正确的?我在这个类中唯一使用dfm的地方是在几个地方调用stringFromDate来返回使用UILabels的自释放字符串。

在此先感谢。

+0

确实 - 所以我学到了=)。我已经添加了'viewDidUnload'问题标题,以便人们在遇到此问题时可能会发现此帖。 – Chazbot 2011-04-10 16:42:49

回答

5

您不能依靠viewDidUnload进行调用。您还需要:

- (void)dealloc { 
    self.dfm = nil; 
    // whatever else you need 
    [super dealloc]; 
} 

你只需要self.dfm = nil因为默认的合成setter方法做的释放。

+0

我只是试图补充说,尽管它没有解决泄漏问题。我已经在我的viewDidUnload中设置了'self.dfm = nil',所以在dealloc中不再调用它是多余的? thx为快速反应。编辑:错过了你的第一行=)。不幸的是,它仍然泄漏... – Chazbot 2011-04-09 22:12:39

+0

啊!在XCode中清理我的项目并进行更多测试之后,确实存在这个问题:viewDidUnload未被调用。非常感谢。 – Chazbot 2011-04-09 22:38:11