表视图图像永远不会被释放
我正在对我的一个应用程序进行重大更新,并试图减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图像,它都会从内存中释放(移除)所有图像对象。
如何检查你的视图控制器是否分配(释放)或不?
脚步:
- 从Xcode长按运行button。 你会得到一个小的popup窗口,从中selectconfiguration文件 。 你可以看到新图标取代了运行图标。 (同样,你可以改变它运行button来运行应用程序)。
-
点击此button将开始分析您的应用程序。
-
在乐器窗口中select分配部分。 分配列表视图上方有一个文本框。 点击该字段并编写您的视图控制器名称。 (在你的情况SettingViewController)。
- 您只能看到与您刚input的关键字相关的过滤结果。 现在去模拟器 – >模拟你的stream量。 从视图控制器中popup,并在离开视图控制器(如果仍在列表中)的情况下检入乐器 。 如果列表中的内容比您的视图控制器没有从内存中释放,并且每次打开该视图控制器都会增加内存,并且在应用程序运行之前永远不会释放。
我们如何可以分配视图控制器?
我会试着解释一些我知道要分配控制器的方法。
[1]在你的视图控制器中覆盖dealloc方法,并在其中释放对象。 主要是可变的variables和委托。 在-dealloc
方法上放置一个debugging断点,并确保在离开该控制器时调用它。
注意:如果你为UIPickerView
, UIPopoverController
, UIImagePickerController
等类创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了名称为MenuView
的UIView
(或任何其他视图)的子类。 你已经在你的视图控制器中创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中,这是你的内存问题的原因
- NSArray * excludedActivities即使使用ARC并将其设置为零,也会泄漏内存
- UIWebView泄漏,JS垃圾收集器和WebCore虚拟机
- UIActivityViewController – 不能理解这个内存泄漏
- 内存泄漏 – UIImagePNGRepresentation
- 当从NSMutableDictionary派生时,FastEnumeration中的内存泄漏
- React Native ios应用程序中的“libBacktraceRecording.dylib”会导致内存泄漏
- 内存泄漏与SubstringWithRange NSString
- 目标C:如何解决代码泄漏(仪器结果)
- imageWithCGImage根据仪器泄漏