我需要澄清一下我是不是应该(可以?)取消分配与视图相关的 UI 元素

Posted

技术标签:

【中文标题】我需要澄清一下我是不是应该(可以?)取消分配与视图相关的 UI 元素【英文标题】:I need some clarification about whether I should (could?) deallocate view-related UI elements or not我需要澄清一下我是否应该(可以?)取消分配与视图相关的 UI 元素 【发布时间】:2015-07-18 07:29:50 【问题描述】:

所以我明白,我应该释放我拥有的对象。 (alloc/copy/retain 东西)

而且我也明白(有点?),如果我的某些类中有 @propertyretain,或者一些带有 alloc/init 的实例变量,那么我应该编写一个自定义的 dealloc 来确保那些那些会被该类释放。

我不明白的是我应该手动释放cell 对象吗? (因为我是在 cellForRowAtIndexPath 中使用 alloc/init 创建它的?是的,我知道,当 tableView 被释放时应该杀死这些单元格,但我要确定吗?

另外,我可以手动释放UILabelUITextField 等吗?我确实知道当您解除分配视图时它们会被杀死,但是我仍然要确定吗?

更新: 是的,感谢有关引用计数的提示,但该项目的确切目的是使用手动内存管理来做一些简单的事情。 有趣的是,现在大多数导师完全跳过这部分,所以像我这样的新手必须自己弄清楚所有这些东西。

【问题讨论】:

【参考方案1】:

Objective C 支持Automatic Reference Counting,它为您完成几乎所有的内存管理。我建议您将旧代码迁移到 ARC;这很容易(Xcode 对此有重构支持),它会为您省去很多麻烦。

【讨论】:

感谢提示,但启用 arc 与任务背道而驰【参考方案2】:

除非您有一个指向 UI 元素的 strong/retain 指针,否则它们会在它们离开屏幕后自动释放。

关于cells - 你永远不应该dealloc 他们,因为他们打算被重复使用。如果你 dealloc 和 re-init 他们你会在滚动时得到一个REALLY糟糕的表现。

另外,正如Glorfindel 所说,考虑使用ARC(如果您还没有使用),您的生活会轻松很多。

【讨论】:

以上是关于我需要澄清一下我是不是应该(可以?)取消分配与视图相关的 UI 元素的主要内容,如果未能解决你的问题,请参考以下文章

为啥我应该使用 char 而不是 varchar? [复制]

澄清我被分配的一些javascript任务[关闭]

SwiftUI - 在导航堆栈中弹回不会取消分配视图

什么时候应该使用 MySQLi 而不是 MySQL?

想澄清一下是视图加载错误还是代码问题?

控制器内部应该写啥逻辑?