不知道为什么这是内存泄漏,请指教!
问题描述:
我有这个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;
}
答
这行看起来有问题的:
NSString *stringDate = [[DiaryDateFormatter alloc] convertDateToString:[diaryEntry diaryDate]];
- 一旦你分配一个类的实例,你需要初始化它。如果
convertDateToString:
是一个初始化方法,那么它应该重命名。然而,看起来convertDateToString:
应该是一个类方法(这样你就不必分配DiaryDateFormatter
类的实例)。 -
alloc
方法总是为您提供+1保留计数的对象。因此,您有责任释放它。代码的设置方式意味着您不能再访问分配的对象以释放它。
尝试改变上面的代码行成这样:
DiaryDateFormatter *formatter = [[DiaryDateFormatter alloc] init];
NSString *stringDate = [formatter convertDateToString:[diaryEntry diaryDate]];
[formatter release];
而且,不释放stringDate
,因为使用其名称的方法并没有得到它意味着你有所有权。
答
我看到的问题。您使用的Objective-C,你是没有好处(像我一样)
更重要的是,IIRC你应该使用自动释放,而不是对细胞的分配,如果你是é会返回它?这就是我记得以前我跳船...
我终于弄清楚了,到了它觉得这样的年龄。但是现在我已经杀死了那个covertDateToSting的东西。刚刚造成了问题。在那之后问题解决了。 – 2010-08-11 06:09:10