假设静态变量永远不会被清除是否安全?

时间:2015-06-09 12:55:01

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

我曾让用户在应用程序中报告随机崩溃,尤其是在其他应用程序之间切换时。不幸的是,我无法复制崩溃或抓住崩溃日志。在我的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"); 
            }
        }

        //...
    }
}  

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

1 个答案:

答案 0 :(得分:1)

  

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

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

  

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

这种比较并非一蹴而就,因为NSUserDefaults中的值在关闭应用程序甚至关闭设备时仍然存在,而static必须在启动时初始化起来。如果需要在不同的运行中保持WebServiceURLUserId,那么NSUserDefaults是一种很好的方法;否则,static就足够了。