2

我已經讓用戶報告應用程序中的隨機崩潰,特別是在其他應用程序之間切換時。不幸的是,目前我無法複製崩潰或獲取崩潰日誌。在我的iPhone應用程序,我已經在那裏我存儲變量,我指的是整個應用程序的靜態類 - 我有一種預感,這是什麼原因造成的問題:假設靜態變量永遠不會被清除是否安全?

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會對啓動初始化。如果在不同運行期間堅持WebServiceURLUserId是可取的,那麼NSUserDefaults是一個好方法;否則,static就夠用了。

+0

只是澄清 - 在上面的示例中,我將AppController.User設置爲登錄過程中的新用戶對象。然後我在代碼的某些部分調用它,例如AppController.User.FirstName。因爲我沒有在其他地方引用這個AppController.User對象,這是否會使它變弱並因此被清除? – Joseph

+0

@Joseph使變量變弱的唯一方法是在其聲明中添加'weak'關鍵字。您使用變量的方式不會改變其強/弱的名稱。 – dasblinkenlight

相關問題