gpt4 book ai didi

ios - 从未发布的表格 View 图像

转载 作者:可可西里 更新时间:2023-11-01 17:06:30 24 4
gpt4 key购买 nike

我正在对我的一个应用程序进行重大更新,并尝试减少内存使用并使其更干净、更快。我正在使用 Instruments 来分析应用程序并查看 UIImage 分配,当应用程序启动时我有大约 10 个(尽管一个是状态栏图标?不知道为什么包括在内)。当我打开我的设置 View Controller (它在 iPad 上的 Split View Controller 中)时,它基本上有一个包含每个表格 View 单元格的图像,这很多。第一次展示它增加了 42 张图像。当我关闭这个 View Controller 时,仍然有 52 张图像,而现在应该只有 10 张。如果我再次展示 Controller ,现在有 91 张图像。这一直在上升和上升。仪器并没有说有泄漏,我也不知道发生了什么。每个单元格设置一个图像,如

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

我怎样才能弄清楚为什么这些图像没有被发布?

enter image description here

编辑:我认为它现在正在重新分配图像。我从直接设置 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 是一个单例,它使用主题类将单元格的属性设置为主题,如文本标签颜色、突出显示颜色、详细文本标签颜色和背景颜色。

最佳答案

这里可能的原因是你的设置 View Controller 没有被释放(没有从内存中释放)。无论 View Controller 中有多少图像,当 View Controller 从内存中释放时,它都会从内存中释放(删除)所有图像对象。

如何检查你的 View Controller 是否被取消分配(释放)?

步骤:

  1. 在 Xcode 中长按运行按钮。您会看到一个小弹出窗口,从中选择个人资料。您可以看到新图标取代了 Run 图标。 (同样,您可以将其更改为“运行”按钮以运行应用程序)。

enter image description here

  1. 单击此按钮将开始分析您的应用程序。

  2. Instruments 窗口中选择Allocations 部分。分配 ListView 上方有一个文本字段。单击该字段并写下您的 View Controller 名称。 (在您的情况下是 SettingViewController)。

enter image description here

  1. 您只能看到与您刚刚输入的关键字相关的过滤结果。现在转到 Simulator -> Simulate your flow。从您的 View Controller 弹出并在 Instruments 中检查离开该 View Controller 后是否仍在列表中。如果它在列表中,那么您的 View Controller 不会从内存中释放,并且每次您打开该 View Controller 时都会增加内存并且在应用程序运行之前永远不会释放。

我们如何取消分配 View Controller ?

我将尝试解释一些我知道的取消分配 Controller 的方法。

[ 1 ] 在您的 View Controller 中覆盖 dealloc 方法并释放其中的对象。主要是可变变量和委托(delegate)。在 -dealloc 方法上放置一个调试断点,并确保在您离开该 Controller 时调用它。

注意:如果您为 UIPickerViewUIPopoverControllerUIImagePickerController 等类创建了全局变量,并且为此设置委托(delegate),而不是这些委托(delegate)在 -dealloc 方法中必须为 nil

例如

Objective-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方法,释放相关对象和委托(delegate)。类似的,必须调用它们的 dealloc 方法。

例如

检查这个场景:假设您创建了一个名为 MenuViewUIView(或任何其他 View )的子类。并且您已经在 View Controller 中创建了此类的全局变量,它的 dealloc 方法将在 View Controller 的 dealloc 方法之前被调用。

@property (nonatomic, strong) MenuView    *menuView;

所以这里的 MenuView 类需要覆盖 -dealloc 方法,并且必须在调用 View Controller 的 dealloc 方法之前调用。

因此在离开整个容器之前,它的 subview 被释放并从内存中删除。

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

如果它的 dealloc 方法没有被调用,那么 MenuView 类的对象仍然在内存中,并且您的 View Controller 类正在引用该对象。因此,即使您的 View Controller 的 -dealloc 被调用,它也不会被释放,因为 MenuView 类对象是事件的。


[ 3 ] 您需要设置对IBOutletweak 引用。例如

Objective-C 代码:

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

Swift 代码:

@IBOutlet weak var tableView: UITableView!

如有任何不清楚的地方,请随时询问。

关于ios - 从未发布的表格 View 图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26921227/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com