我有用户报告在一个应用程序中随机崩溃,特别是在其他应用程序之间切换时。不幸的是,目前我无法复制崩溃或获取崩溃日志。在我的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");
}
}
//...
}
}
这是更好的做事方式吗?
我的理解是静态引用永远不会被ARC清除,这是正确的吗?
是的,这是正确的。ARC不会清除你的静态变量,除非它们是weak
,并且它们引用的对象没有其他引用。
我可以将这些静态值替换为对
NSUserDefaults
的引用。这是一种更好的做事方式吗?
这个比较不是苹果对苹果的比较,因为NSUserDefaults
中的值在关闭应用程序甚至关闭设备时仍然存在,而static
必须在启动时初始化。如果需要在不同的运行中持久化WebServiceURL
和UserId
,那么NSUserDefaults
是一个很好的方法;否则,static
就足够了。