表视图图像永远不会被释放

我正在对我的一个应用程序进行重大更新,并试图减less内存使用量,使其更清洁,更快。 我使用的仪器来分析应用程序,我正在看UIImage的分配,我约10时,应用程序启动(虽然一个是一个状态栏图标?不知道为什么包括)。 当我打开我的设置视图控制器(这是在iPad的分割视图控制器)它基本上与每个表视图单元格,这是一个很大的图像。 首次展示它添加了42个图像。 当我解雇这个视图控制器时,仍然有52个图像,现在应该只有10个。 如果我再次出示控制器,现在有91个图像。 这不断上升。 仪器没有说有泄漏,我不知道发生了什么。 每个单元格设置一个图像

cell.imageView.image = [UIImage imageNamed:@"Help-Icon"]; 

我怎样才能找出为什么这些图像没有被释放?

在这里输入图像说明

编辑:我认为它现在释放的图像。 我从设置imageView图像直接更改为setImage:所以现在一个表单元格看起来像这样:

  cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (!cell) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier]; } cell.textLabel.text = NSLocalizedString(@"Homepage", @"Homepage"); UIImage *cellImage = [UIImage imageNamed:@"Homepage-Icon"]; [cell.imageView setImage:cellImage]; [MLThemeManager customizeTableViewCell:cell]; return cell; 

MLThemeManager是一个使用主题类将单元格的属性设置为主题的单例,如文本标签颜色,突出显示颜色,详细文本标签颜色和背景颜色。

这里可能的原因是因为你的设置视图控制器没有被释放(不从内存释放)。 不pipe视图控制器从内存中释放的视图控制器中有多less图像,它都会从内存中释放(移除)所有图像对象。

如何检查你的视图控制器是否分配(释放)或不?

脚步:

  1. 从Xcode长按运行button。 你会得到一个小的popup窗口,从中selectconfiguration文件 。 你可以看到新图标取代了运行图标。 (同样,你可以改变它运行button来运行应用程序)。

在这里输入图像说明

  1. 点击此button将开始分析您的应用程序。

  2. 乐器窗口中select分配部分。 分配列表视图上方有一个文本框。 点击该字段并编写您的视图控制器名称。 (在你的情况SettingViewController)。

在这里输入图像说明

  1. 您只能看到与您刚input的关键字相关的过滤结果。 现在去模拟器 – >模拟你的stream量。 从视图控制器中popup,并在离开视图控制器(如果仍在列表中)的情况下检入乐器 。 如果列表中的内容比您的视图控制器没有从内存中释放,并且每次打开该视图控制器都会增加内存,并且在应用程序运行之前永远不会释放。

我们如何可以分配视图控制器?

我会试着解释一些我知道要分配控制器的方法。

[1]在你的视图控制器中覆盖dealloc方法,并在其中释放对象。 主要是可变的variables和委托。 在-dealloc方法上放置一个debugging断点,并确保在离开该控制器时调用它。

注意:如果你为UIPickerViewUIPopoverControllerUIImagePickerController等类创build了全局variables,并且为这些委托设置委托,那么在-dealloc方法中必须是nil

例如

目标C代码:

 //--------------------------------------------------------------- #pragma mark #pragma mark Memory management methods //--------------------------------------------------------------- - (void) dealloc { [self.tableView setDelegate:nil]; [self.tableView setDataSource:nil]; } 

SWIFT代码:

 deinit { self.tableView.dataSource = nil self.tableView.delegate = nil } 

[2]子类的全局对象也需要重写-dealloc方法并释放相关的对象和委托。 类似的,他们的dealloc方法必须被调用。

例如

检查这个场景:比方说,你已经创build了名称为MenuViewUIView (或任何其他视图)的子类。 你已经在你的视图控制器中创build了这个类的全局variables,而不是在视图控制器的dealloc方法之前调用dealloc方法。

 @property (nonatomic, strong) MenuView *menuView; 

所以这里的MenuView类需要重写-dealloc方法,并且必须在你的视图控制器的dealloc方法被调用之前被调用。

所以,在离开整个容器之前,它的子视图被释放并从内存中移除。

MenuView类中检查这个对象是否仍然是他们的?

如果它的dealloc方法没有被调用,那么MenuView类的对象仍然在内存中,而你的视图控制器类正在引用该对象。 所以,即使你的视图控制器的-dealloc被调用,也不会因为MenuView类对象是活的而被释放。


[3]您需要设置IBOutlet weak引用。 例如

目标C代码:

 @property (nonatomic, weak) IBOutlet UITableView *tableView; 

SWIFT代码:

 @IBOutlet weak var tableView: UITableView! 

随意问,如果有什么不清楚。

不要使用图像资产…复制图像到你的文件夹到你的项目加载它的代码与imageWithContentOfFile它对我工作

尝试使用imageWithContentsOfFile来加载图像。

正如rmaddy所说, imageNamed会让你的图像留在caching中,这是你的内存问题的原因