【问题标题】:Is it safe to assume static variables never get cleared?假设静态变量永远不会被清除是否安全?
【发布时间】:2015-06-09 12:55:00
【问题描述】:

我曾有用户报告某个应用程序发生随机崩溃,尤其是在其他应用程序之间切换时。不幸的是,我暂时无法复制崩溃或获取崩溃日志。在我的 iOS 应用程序中,我有一个静态类,用于存储我在整个应用程序中引用的变量 - 我有一种预感,这就是导致问题的原因:

namespace DemoApp.BusinessLogic
{
    public static class AppController
    {
        public static string WebServiceURL { get; set; }
        public static int UserId { get; set; }
        public static User User { get; set; }
        //...
    }
}  

这些值在用户首次登录应用程序时启动。我的理解是 ARC 永远不会清除静态引用,这是正确的吗?我可以安全地假设这些值在应用程序关闭之前永远不会被清除吗?

我可以将这些静态值替换为对NSUserDefaults 的引用:

namespace DemoApp.BusinessLogic
{
    public static class AppController
    {
        public static string WebServiceURL { 
            get { 
                return NSUserDefaults.StandardUserDefaults.StringForKey("WebServiceURL"); 
            } 
            set { 
                NSUserDefaults.StandardUserDefaults.SetString(value, "WebServiceURL"); 
            }
        }

        public static string UserId { 
            get { 
                return NSUserDefaults.StandardUserDefaults.StringForKey("UserId"); 
            } 
            set { 
                NSUserDefaults.StandardUserDefaults.SetString(value, "UserId"); 
            }
        }

        //...
    }
}  

这是一种更好的做事方式吗?

【问题讨论】:

    标签: ios xamarin crash garbage-collection automatic-ref-counting


    【解决方案1】:

    我的理解是 ARC 永远不会清除静态引用,这是正确的吗?

    是的,这是正确的。 ARC 不会清除您的静态变量,除非它们是 weak 并且它们引用的对象没有其他引用。

    我可以将这些静态值替换为对NSUserDefaults 的引用。这是一种更好的做事方式吗?

    这种比较不是苹果对苹果,因为NSUserDefaults 中的值将在关闭应用程序甚至关闭设备电源后仍然有效,而static 必须在启动时初始化。如果在不同的运行中保持WebServiceURLUserId 是可取的,那么NSUserDefaults 是一个好方法;否则,static 就足够了。

    【讨论】:

    • 只是为了澄清一下——在上面的例子中,我在登录过程中将 AppController.User 设置为一个新的 User 对象。然后我在代码的某些部分调用它,例如 AppController.User.FirstName。由于我没有在其他任何地方引用此 AppController.User 对象,这是否会使其变弱并因此被清除?
    • @Joseph 使变量变弱的唯一方法是在其声明中添加weak 关键字。使用变量的方式不会改变它的强/弱名称。
    猜你喜欢
    • 1970-01-01
    • 2021-09-11
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-03
    • 2019-01-24
    • 1970-01-01
    相关资源
    最近更新 更多