【问题标题】:Is "create then release then re-create then release" better than "create then use twice then release"?“创建然后发布然后重新创建然后发布”比“创建然后使用两次然后发布”更好吗?
【发布时间】:2026-01-12 12:45:01
【问题描述】:

假设您有一个可以刷新的 tableview。每次点击刷新时,你会将activityAnimator保存在内存中还是重新创建?

我知道这听起来很明显,很明显,在第一种情况下,您可以加快应用程序的速度,而在另一种情况下,您可以获得更多的可用内存空间。

但我想知道两者中的一个是否更接近“Apple 标准”。

哪个更重要? CPU 使用还是内存使用?

别告诉我这取决于我需要做什么。

【问题讨论】:

    标签: ios memory-management


    【解决方案1】:

    我认为“activityAnimator”是指UIActivityIndicatorView

    如果是这种情况,您应该通过 Interface Builder 添加指示器,并将其连接到您的视图控制器。这意味着如果控制器不是最顶层的,操作系统可以释放连接的对象,包括指示器(如果需要)。这也意味着您不必在每次使用时都创建和销毁它。两全其美。

    话虽如此,这感觉像是过早的优化。我想支持您的表格视图的数据源会占用更多的内存,而UIActivityIndicatorView 会占用更多的内存。我建议在IB中设置UIActivityIndicatorView并使用它。

    【讨论】:

    • 我试图在 IB 中添加我的 UIActivityIndi​​catorView,但它只是不允许我这样做......在 IB 中,我有一个带有导航控制器和根视图控制器的窗口。我在我的 rootViewController 中添加了我的 tableView,但是每次我尝试在我的 tableView 上方添加我的指标时,它都会替换我的 tableView 并且我只有我的微调器......问题是我希望我的微调器位于我的 tableView 之上......
    • @gotye 你的表格视图应该是一个 UIView 的兄弟,活动指示器也应该是同一个 UIView 的兄弟。所以创建一个新的 UIView,将它连接到控制器的视图 IBOutlet,然后添加一个表格视图和一个活动微调器。如果您仍然无法理解,请参阅 IB 教程。
    【解决方案2】:

    我认为不存在“Apple 标准”。

    但是我认为最好的方法是将对象保存在内存中,因为它可以让应用程序提高性能。如果应用程序需要内存,操作系统将调用 didReceiveMemoryWarning 方法,此时您必须释放未使用的对象。

    但是如果你有很多对象,不时释放一些对象应该是个好主意。

    如果您需要更多信息,可以查看Memory Management Programming Guide for Cocoa

    【讨论】:

      【解决方案3】:

      创建一个方法来创建并返回activityAnimator。它应该检查它是否为 nil 以及是否创建它。如果不只是返回现有的。然后你可以持久化它并且只在那个 viewController 的 dealloc 或者如果 didRecieveMemoryWarning 时释放它。然后,当您需要使用它而不是引用类的引用时,调用您的方法以确保引用被实例化。这样您就可以获得最佳性能,但不会遇到内存问题。

      【讨论】:

      • 视图控制器实际上是我的导航控制器的根视图控制器......当我推送一个新视图时会调用我的根视图控制器的dealloc方法吗?
      • 我认为不会。但是,由于它总是会在内存不足时释放它(如果你允许的话),我不再担心它了。就像@freespace 说的那样。 UIActivityIndi​​catorView 的内存占用可能只是 tableView 数据源的一小部分,我不会太担心。选择此处建议的任何一种方法。它会正常工作的。
      • 好的,我想我明白了!干杯
      最近更新 更多