菜鸟教程小白 发表于 2022-12-13 07:57:04

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


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

<pre><code>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; }
      //...
    }
}
</code></pre>

<p>这些值在用户首次登录应用程序时启动。我的理解是 ARC 永远不会清除静态引用,这是正确的吗?我可以安全地假设这些值在应用程序关闭之前永远不会被清除吗?</p>

<p>我可以将这些静态值替换为对 <code>NSUserDefaults</code> 的引用:</p>

<pre><code>namespace DemoApp.BusinessLogic
{
    public static class AppController
    {
      public static string WebServiceURL {
            get {
                return NSUserDefaults.StandardUserDefaults.StringForKey(&#34;WebServiceURL&#34;);
            }
            set {
                NSUserDefaults.StandardUserDefaults.SetString(value, &#34;WebServiceURL&#34;);
            }
      }

      public static string UserId {
            get {
                return NSUserDefaults.StandardUserDefaults.StringForKey(&#34;UserId&#34;);
            }
            set {
                NSUserDefaults.StandardUserDefaults.SetString(value, &#34;UserId&#34;);
            }
      }

      //...
    }
}
</code></pre>

<p>这是一种更好的做事方式吗?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><blockquote>
<p>My understanding was that static references are never cleared by ARC, is this correct?</p>
</blockquote>

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

<blockquote>
<p>I could replace these static values to references to <code>NSUserDefaults</code>. Is this a better way of doing things?</p>
</blockquote>

<p>这种比较不是苹果对苹果,因为 <code>NSUserDefaults</code> 中的值将在关闭应用程序甚至关闭设备电源后仍然存在,而 <code>static</code> 将具有在启动时进行初始化。如果希望在不同的运行中持久保存 <code>WebServiceURL</code> 和 <code>UserId</code>,那么 <code>NSUserDefaults</code> 是一个好方法;否则,<code>static</code> 就足够了。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 假设静态变量永远不会被清除是否安全?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/30732630/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/30732630/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 假设静态变量永远不会被清除是否安全?