菜鸟教程小白 发表于 2022-12-13 04:52:16

ios - NSUserDefaults 拒绝保存


                                            <p><p>启动一个新的单 View 项目并更新主 ViewController 的 viewDidLoad。目的是检索和增加存储在 <code>NSUserDefaults</code> 中的值并保存。</p>

<pre><code>- (void)viewDidLoad
{
    ;

    NSString *key = @&#34;kTheKey&#34;;

    NSNumber *number = [ objectForKey:key];
    NSLog(@&#34;current value is %@&#34;, number);

    NSNumber *incremented = @(number.integerValue + 1);
    NSLog(@&#34;new value will be %@&#34;, incremented);

    [ setObject:incremented forKey:key];
    [ synchronize];

    NSLog(@&#34;reboot&#34;);
}
</code></pre>

<p>如果我从 Xcode 中强制退出应用程序(或在实际使用中,重新启动设备),默认值通常不会保存。这是一些示例输出:</p>

<pre><code>current value is (null)
new value will be 1
reboot
current value is 1
new value will be 2
reboot
current value is 1
new value will be 2
reboot
</code></pre>

<p>似乎有一些时间组件 - 如果我在重新启动前等待 3 秒以上,则更有可能保存默认设置。请注意,第一次执行被“允许”保存,方法是在停止执行前等待几秒钟。第二次执行在第一秒或第二秒停止,导致第三次运行中记录的值没有变化。这可以在我运行 iOS 8.1 的 iPad Air 2 上重现。</p>

<p>这可能是什么原因?</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这是正常行为。</p>

<p>用户默认设置排队保存。当您“强制退出”应用程序时,您并没有给它时间这样做。</p>

<p>我假设在 Xcode 上你的意思是停止。你提到exit(0);。对于 iOS 应用程序来说,这两件事都不是“正常的”。此类强制退出不应在 iOS 应用中进行。</p>

<p>当用户以正常方式(多任务 View 和向上滑动应用程序)退出应用程序时,它实际上并没有立即退出。它就像从 View 中移除一样。但是用户默认值将在此之后被写出。最多几秒钟后。当他们点击主页按钮时也是如此。</p>

<p>文档完整地解释了应用程序的生命周期。使用消息。并且您应该在收到这些消息时强制清除默认值。像这样放入您的初始化或 ViewDidLoad:</p>

<pre><code>    [ addObserver:self selector:@selector(movingToBackground:) name:UIApplicationWillResignActiveNotification object:nil];
    [ addObserver:self selector:@selector(movingToForeground:) name:UIApplicationDidBecomeActiveNotification object:nil];
    [ addObserver:self selector:@selector(updateDefaults:) name:UIApplicationWillTerminateNotification object:nil];
</code></pre>

<p>然后像这样创建方法 <code>movingToBackground</code>、<code>movingToForeground</code> 和 <code>updateDefaults</code>:</p>

<pre><code>-(void) updateDefaults: (NSNotification *) notification {
   [ synchronize];
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - NSUserDefaults 拒绝保存,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/28010868/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/28010868/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - NSUserDefaults 拒绝保存