【问题标题】:Where should I release static local and global variable with ARC?我应该在哪里使用 ARC 释放静态局部和全局变量?
【发布时间】:2014-01-29 18:49:07
【问题描述】:

我刚刚在我的项目中创建了一个新类,它是 UITableViewController 的子类,并注意到在方法 tableView:cellForRowAtIndexPath: 模板中,Apple 仍然提供了一个静态本地 NSString 用作单元格标识符。

我知道对于静态全局/局部变量,我们需要分配 nil,因为它被认为是强变量。

所以我问自己一个问题:我应该在哪里将 nil 分配给静态全局变量? 还有静态全局变量?

谢谢大家的回答

【问题讨论】:

    标签: ios iphone memory static automatic-ref-counting


    【解决方案1】:

    对于“静态全局变量应该在哪里释放”的简短回答是“无处”。

    长答案是这样的:当你创建一个变量static 或全局变量时,你希望它存在,而不管你的类的任何实例是否存在或被释放。简而言之,您希望您的statics 始终在您身边。因此,释放它们的唯一原因是您的程序即将退出。但是,如果您的程序无论如何都退出了,您不妨让操作系统为您处理清理工作,而忘记释放您的全局变量和静态变量。

    但是请注意,使用static 和全局变量应该是一个例外,而不是常态。你使用它们是有充分理由的,并运用你的最佳判断来决定应该是static。此外,您应该避免通过强引用从静态变量中引用非静态变量的集合,否则可能会造成难以发现的内存泄漏。

    NSString 用作单元格标识符的静态局部变量没有任何问题:它占用的内存非常少,并且不会增长,因此在结束时不释放它并不是什么大问题程序正在运行。

    【讨论】:

    • 并且在全局或本地静态的情况下,它不会阻止我的 tableView 被释放?
    • @Dabrut 除非全局或静态直接或间接引用您的tableView,否则不会。另一方面,您的tableView 允许在其实现中包含尽可能多的静态变量或全局变量:只要对视图的引用未存储在其中一个中,表格视图的实例就可以随它们来去去去请。
    • 对不起,我的意思是我的 UITableViewController 而不是我的 uitableview
    • @Dabrut 相同的处理:在方法内部或外部存在静态变量不会阻止相应对象的实例被释放,除非变量指向其中一个实例,并且也是一个__strong 变量。
    • 感谢您的解释;)
    【解决方案2】:

    你不需要这样做,它永远不会被释放并且没关系,因为它是一个全局的。

    在 ARC 中,默认情况下将被视为强,其生命周期等于应用程序生命周期。

    【讨论】:

      【解决方案3】:

      静态字符串是一种特殊情况,不需要释放。

      【讨论】:

        【解决方案4】:

        静态变量,意味着它持有对其指向的对象的强引用。

        static MyClass *var;
        var = [MyClass instance];
        

        现在var 始终持有对上述分配对象的强引用。因此它永远不会从内存中删除。

        但是在某些情况下,您不再需要该对象,然后只需 var =nil 会起作用。
        因为现在var指向nil,不再指向创建的对象。所以该对象将从内存中删除。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-03-21
          • 1970-01-01
          • 2015-10-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-30
          • 1970-01-01
          相关资源
          最近更新 更多