【问题标题】:Memory management in viewControllersviewControllers 中的内存管理
【发布时间】:2012-10-06 11:51:33
【问题描述】:

在我的应用程序中,我有许多 viewControllers,在这些视图的 viewDidUnload 方法中,我一直将变量设置为 nil,如下所示,myString = nil; - 但是我想知道这是否是正确的方法?

我的其他 viewControllers 都使用这行代码 [self dismissModalViewControllerAnimated:YES]; 关闭/关闭,但是我不确定这是否真的会调用 viewDidUnload 方法或者是否有更好的方法正在卸载 viewController

我从来没有 100% 清楚地知道内存管理的确切规则,我知道有了新的 ARC 功能,它变得更容易了。

【问题讨论】:

    标签: iphone variables memory memory-management view


    【解决方案1】:
    1. 您是否使用 ARC?
    2. 如果不使用 ARC,myString = nil 不会执行任何操作,也不会释放任何内容(但 self.myString = nil 会执行)
    3. 如果您将视图存储在@property(retain)(或@property(copy))中,则应在viewDidUnload 中将这些属性设置回nil。 (在不推荐使用viewDidUnloadiOS6 之后,您甚至应该在didReceiveMemoryWarning 中释放它们,并且仅当isViewLoadedYES 并且self.view.windownil 时)
    4. 您不会使用dismissModalViewControllerAnimated 关闭/解雇subviews。你解雇UIViewControllers。当你关闭一个 viewController 时,它会从视图层次结构中删除它的视图。请务必了解 viewsviewControllers 之间的区别(它们是不同的对象,MVC 模式的不同部分)

    【讨论】:

    • 你想说,如果我们没有在@property(retain)(或@property(copy))中存储变量,那么我们应该先释放它并在didReceiveMemoryWarning或viewDidUnload中赋值给nil?跨度>
    • 我正在使用 ARC,但我没有在我的变量上使用 @property。我所做的少数几个我已经完成了self.myVariable = nil 所以应该注意这些,我只是对其他变量感到好奇。抱歉,关于子视图混乱,它正在关闭的视图是viewControllers - 只是想知道当它们不再使用/视图时是否有必要卸载这些viewControllers。以及其中使用的变量。
    • @NuzhatZari 是的,如果您不使用 @properties 而只使用实例变量,并且不使用 ARC,那么您必须自己管理内存。当您的 viewController 的视图由于 memoryWarning 被卸载时(直到现在在 viewDidUnload 中,以及在 iOS6 之后的未来版本中的 didReceiveMemoryWarning 因为 viewDidUnload 在以后的版本中将不存在),那么您还应该释放的每个子视图您以前保留自己的观点。
    • @KarlDaniel 如果你使用 ARC,你应该将你的子视图存储在 weak 变量中,这样当子视图从视图层次结构中移除时它会自动释放并设置为 nil (尤其是当你的主视图正在卸载)。如果您不能为某些视图使用weak 变量(因为您有时会从主视图中删除它们并稍后添加它们,例如,根据某些条件等...),因此将它们存储在strong 实例中变量,您需要将这些 ivars 设置回 viewDidUnload 中的 nil,以便在这种情况下回收它们的内存。
    • 没有什么可以直接做的。您只需正确实现viewDidUnload(即,如果不使用 ARC,则释放您保留的子视图)。当您在另一个视图控制器上推送或呈现视图控制器时,只要您的 iPhone 上有足够的 RAM,第一个 VC 及其视图仍然存在于内存中。如果您在应用程序中的某个时间点收到 memoryWarning,则每个视图在屏幕上不可见的 VC(通常是可见视图下方的每个 VC)都将卸载它们的视图以回收一些内存,然后将调用 viewDidUnload 以允许您释放您的子视图和网点的内存
    【解决方案2】:

    只需定义 NSString *myString 并做

    myString = nil;
    

    然后它将空指针设置为 myString 但如果它被引用则不会释放内存。

    现在如果你创建 NSString *myString 的 @property 那么:

    self.myString = nil; 
    

    如果被引用则释放内存并添加空指针。

    现在在 ARC 中,无需释放对象,因为它会自动释放,而只需明智地使用

    非ARC中,您需要释放分配或引用的内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-30
      • 2011-07-25
      • 2012-09-19
      • 2011-01-30
      • 2012-08-27
      • 2016-12-01
      • 1970-01-01
      相关资源
      最近更新 更多