菜鸟教程小白 发表于 2022-12-12 19:09:33

objective-c - 内存警告会破坏呈现的 View Controller 吗?


                                            <p><p>我有一个 iPad 应用程序,它有一个主视图 Controller ,然后是一个设置 ViewController 。当我的主视图呈现设置 View 时,我会全屏呈现设置 View 。设置 View 中有一个关闭按钮,该按钮有效 - 直到出现内存警告。如果设置按钮在屏幕上时出现内存警告,它将拒绝关闭。</p>

<p>换句话说,这是可行的:</p>

<ul>
<li>应用启动 -> 显示主视图 -> 显示设置 View-> 关闭设置 View </li>
</ul>

<p>这不是:</p>

<ul>
<li>应用启动 -> 显示主视图 -> 显示设置 View-> 内存警告 -> 关闭设置 View </li>
</ul>

<p>设置 View 将保留在那里。</p>

<p>我在第一代 iPad 上的 iOS 5 上运行这个应用程序。 (我不支持 iOS 4。)</p>

<p>我该如何解决这个问题?</p>

<p><strong>编辑:</strong></p>

<p>这是我显示设置 View 的代码:</p>

<pre><code>- (void) showSettings{

    if (!self.settingsViewController) {

    //Create the navigation controller and the root view for the settings panel
    SettingsViewController *settingsRootView = [ initWithStyle:UITableViewStyleGrouped];
    UINavigationController *settingsView = [ initWithRootViewController:settingsRootView];
    ;

    //Configure the animation and modal style, and the navigation bar&#39;s color

    ;

    //Enable the settings flag
    ;

    //Configure the presentation
    ;
    ;

    self.settingsViewController = settingsView;

    ;
    }

    //present and release the settings panel
    [self presentViewController:self.settingsViewController animated:YES completion:^{

    }];

}
</code></pre>

<p>我是这样隐藏它的:</p>

<pre><code>//This method reloads some stuff and
- (void) dismissSettings{

    //
    //... Reload some other stuff...
    //

    //Dismiss the settings panel
    [self dismissViewControllerAnimated:YES completion:^{

    //
    //... Reload some other stuff...
    //

    }];
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>原则上,内存警告不会对您的 ViewController 执行任何操作,但它会卸载当前未在屏幕上显示的 ViewController 的 View 。</p>

<p>在您的特定情况下,我会从您的设置 ViewController 中查找代码中可能引用主视图 ControllerView 中的某些内容的任何内容。如果是这种情况,那么在内存警告发生后,该引用可能会为零。</p>

<p>此外,您应该验证 didReceiveMemoryWarning 方法的实现,以查看您是否正在处理关闭该设置 View 可能需要的内容。</p>

<p>在内存不足的情况下,来自那些“非事件” ViewController 的所有 View 都将被卸载。由于您的 <code>dismissSettings</code> 方法是在主 Controller 上声明的,因此当它被调用时,主视图中的所有元素很可能都是 nil。我不知道“重新加载一些其他东西”代码中包含什么样的操作,但我猜与 View 相关的东西正在使方法失败。</p>

<p>我建议将所有与 View 相关的重新加载代码移至 <code>viewDidAppear</code> 方法,因为这样可以保证加载 View 。</p>

<p>另一方面,我建议您在实际设置 ViewController 上实现dismiss方法(请记住,它应该类似于 <code>[ self.navigationControllerdismissModalViewControllerAnimated:YES];</code>需要关闭导航 Controller )。至少,这是我一直这样做的方式,从来没有让我失望过。逻辑是我不希望非事件 ViewController 运行任何逻辑。</p>

<p>最后,正如您提到的,您的目标是 iOS 5 及更高版本,我强烈建议您将项目移至 ARC。做起来比看起来要容易,一旦你搬家了,那真是太棒了。</p>

<p>您的问题的另一个可能原因是您正在使用通知调用您的解除方法,并且您的主 Controller 正在取消订阅 viewDidUnload 方法上的通知。请记住,当内存不足的情况触发时,将调用 viewDidUnload 方法!</p></p>
                                   
                                                <p style="font-size: 20px;">关于objective-c - 内存警告会破坏呈现的 ViewController 吗?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/9033935/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/9033935/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: objective-c - 内存警告会破坏呈现的 View Controller 吗?