2

У меня были пользователи, сообщившие о случайных сбоях в приложении, особенно при переключении между другими приложениями. К сожалению, пока я не могу реплицировать крах или заполучить журналы сбоев. В моем приложении 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

Мое понимание заключалось в том, что статические ссылки никогда не очищаются ARC, это правильно?

Да, это правильно. ARC не очистит ваши статические переменные, если они не являются weak, а объект, который они ссылаются, не имеет других ссылок.

Я могу заменить эти статические значения на ссылки на NSUserDefaults. Это лучший способ сделать что-то?

Это сравнение не яблоки с яблоками, потому что значение NSUserDefaults выживет закрытие приложения и даже выключая устройства, в то время как static должны быть инициализированы при запуске. Если желательно наличие WebServiceURL и UserId на разных прогонах, то NSUserDefaults - хороший подход; в противном случае static достаточно хорош.

+0

Просто уточнить - в приведенном выше примере я устанавливаю AppController.User в новый объект User в процессе входа в систему. Затем я вызываю его в определенных частях кода, например, AppController.User.FirstName. Поскольку я не ссылаюсь на этот объект AppController.User где-нибудь еще, это делает его слабым и, следовательно, подлежащим очистке? – Joseph

+0

@Joseph Единственный способ сделать переменную слабой - добавить в свое объявление ключевое слово 'weak'. То, как вы используете переменную, не меняет своего сильного/слабого обозначения. – dasblinkenlight

Смежные вопросы