2010-08-10 91 views
0

我有这个UITableView应用程序,一个基本的日记应用程序,在这个方法XCode说我有内存泄漏。建议首先泄漏的第一行是117“NSString * CellIdentifier”。 下来如果(细胞== ...,日记* diaryEntry,NSString *字符串日期。 那里它说明方法返回一个+1保留计数拥有的对象 我试图释放单元格, stringDate ...什么都没有改变这个事实,所以我在想什么/做错了什么?不知道为什么这是内存泄漏,请指教!

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

// A date formatter for the time stamp static 

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

if (cell == nil) { 
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease]; 
} 

Diary *diaryEntry = [diaryArray objectAtIndex:indexPath.row]; 

cell.textLabel.text = diaryEntry.diaryTitle; 

NSString *stringDate = [[DiaryDateFormatter alloc] convertDateToString:[diaryEntry diaryDate]]; 

cell.detailTextLabel.text = stringDate;  

[stringDate release]; 
return cell; 

}

回答

1

这行看起来有问题的:

NSString *stringDate = [[DiaryDateFormatter alloc] convertDateToString:[diaryEntry diaryDate]]; 
  1. 一旦你分配一个类的实例,你需要初始化它。如果convertDateToString:是一个初始化方法,那么它应该重命名。然而,看起来convertDateToString:应该是一个类方法(这样你就不必分配DiaryDateFormatter类的实例)。
  2. alloc方法总是为您提供+1保留计数的对象。因此,您有责任释放它。代码的设置方式意味着您不能再访问分配的对象以释放它。

尝试改变上面的代码行成这样:

DiaryDateFormatter *formatter = [[DiaryDateFormatter alloc] init]; 
NSString *stringDate = [formatter convertDateToString:[diaryEntry diaryDate]]; 
[formatter release]; 

而且,不释放stringDate,因为使用其名称的方法并没有得到它意味着你有所有权。

+0

我终于弄清楚了,到了它觉得这样的年龄。但是现在我已经杀死了那个covertDateToSting的东西。刚刚造成了问题。在那之后问题解决了。 – 2010-08-11 06:09:10

-1

我看到的问题。您使用的Objective-C,你是没有好处(像我一样)

更重要的是,IIRC你应该使用自动释放,而不是对细胞的分配,如果你是é会返回它?这就是我记得以前我跳船...