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

Is it safe to assume static variables never get cleared?

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

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"); 
            }
        }

        //...
    }
}  

这是更好的做事方式吗?

My understanding was that static references are never cleared by ARC, is this correct?

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

I could replace these static values to references to NSUserDefaults. Is this a better way of doing things?

此比较不是同类比较,因为 NSUserDefaults 中的值将在关闭应用程序甚至关闭设备电源时继续存在,而 static 必须在启动。如果在不同的运行中坚持 WebServiceURLUserId 是可取的,那么 NSUserDefaults 是一个很好的方法;否则,static 就足够了。