后退按钮后未释放 UITableViewCell 的 UIImage 的内存

Posted

技术标签:

【中文标题】后退按钮后未释放 UITableViewCell 的 UIImage 的内存【英文标题】:memory for UITableViewCell's UIImage not freed after segue back button 【发布时间】:2014-08-09 07:09:09 【问题描述】:

在我的应用程序中,我选择了一个表格视图控制器,其每个单元格中都有一个UIImageView,其中加载了一些 本地 图像文件。但问题是当导航栏中的后退按钮被按下时,分配给图像视图的内存没有被释放并导致内存泄漏:

这是我来回切换到我的表视图时的内存日志:

这是指向我正在谈论的表格视图控制器的prepareForSegue

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.

    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

    if (indexPath) 
        if (indexPath.section == 0) 
            //a section is selected

            if ([segue.destinationViewController isKindOfClass:[SectionTableViewController class]]) 
                 NSString *jsonFilePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"s%ld", (long)indexPath.row + 1] ofType:@"json"];
                 NSData *data = [NSData dataWithContentsOfFile:jsonFilePath];
                 NSDictionary *sectionData = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];
                 SectionTableViewController *stvc = (SectionTableViewController *)segue.destinationViewController;
                 stvc.firstPrb = [sectionData objectForKey:@"firstPrb"];
                 stvc.lastPrb = [sectionData objectForKey:@"lastPrb"];
                 stvc.sectionTitle = [sectionData objectForKey:@"sectionTitle"];
            
        
    
    

这是在提到的表格视图控制器中生成单元格的代码:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ProverbCell" forIndexPath:indexPath];

    // Configure the cell...
    NSString *jsonFilePath = [[NSBundle mainBundle] pathForResource:[NSString stringWithFormat:@"%ld", self.firstProverb.intValue + indexPath.row] ofType:@"json"];
    NSData *data = [NSData dataWithContentsOfFile:jsonFilePath];
    NSDictionary *proverbData = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:nil];

    cell.textLabel.text = [proverbData objectForKey:@"proverb"];
    @autoreleasepool 
    cell.imageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"%ld.jpg", self.firstProverb.intValue + indexPath.row]];
    

    return cell;
    

现在的问题是:点击后退按钮后不应该释放内存吗?!没有指向图像视图或其他任何东西的强指针...

【问题讨论】:

[UIImage imageNamed:] 将缓存UIImage,如果您不需要缓存它,请使用[UIImage imageWithContentsOfFile:]。你也可以自己使用NSMutableDictionary缓存UIImage,然后在属性时释放NSMutableDictionary。 这是在设备上还是模拟器上? @KudoCC 很好的答案!这实际上是我的问题,我使用了[UIImage imageWithContentsOfFile:] 而不是[UIImage imageNamed:],并且图像不再缓存。非常感谢 @duci9y 在模拟器上。 @KudoCC 请发表您的评论作为答案,以便我接受。 :) 谢谢 【参考方案1】:

[UIImage imageNamed:] 会缓存 UIImage,如果你不需要缓存它,使用[UIImage imageWithContentsOfFile:]

你也可以自己缓存UIImage使用NSMutableDictionary,然后在属性时释放NSMutableDictionary

【讨论】:

以上是关于后退按钮后未释放 UITableViewCell 的 UIImage 的内存的主要内容,如果未能解决你的问题,请参考以下文章

UITableViewCell 在可见路径重新加载行后未调整大小

UIbutton 在自定义 UITableViewCell 中释放

在执行功能时单击导航控制器上的后退按钮时应用程序崩溃

Google地图:恢复地图活动后未显示新标记

程序结束后未释放的内存会怎样? [复制]

MySQL InnoDB 从表中删除数据行后未释放磁盘空间