我有一个 iPad 应用程序,它有一个主视图 Controller ,然后是一个设置 View Controller 。当我的主视图显示设置 View 时,我会全屏显示设置 View 。设置 View 中有一个关闭按钮,可以使用 - 直到出现内存警告。如果设置按钮在屏幕上时出现内存警告,它将拒绝关闭。
换句话说,这是可行的:
这不是:
设置 View 将保留在那里。
我在第一代 iPad 上的 iOS 5 上运行这个应用程序。 (我不支持 iOS 4。)
我该如何解决这个问题?
编辑:
这是我显示设置 View 的代码:
- (void) showSettings{
if (!self.settingsViewController) {
//Create the navigation controller and the root view for the settings panel
SettingsViewController *settingsRootView = [[SettingsViewController alloc] initWithStyle:UITableViewStyleGrouped];
UINavigationController *settingsView = [[UINavigationController alloc] initWithRootViewController:settingsRootView];
[settingsRootView release];
//Configure the animation and modal style, and the navigation bar's color
[settingsView.navigationBar setTintColor:kDarkGrayColor];
//Enable the settings flag
[self setSettingsIsActive:YES];
//Configure the presentation
[settingsView setModalPresentationStyle:UIModalPresentationFullScreen];
[settingsView setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];
self.settingsViewController = settingsView;
[settingsView release];
}
//present and release the settings panel
[self presentViewController:self.settingsViewController animated:YES completion:^{
}];
}
下面是我如何隐藏它:
//This method reloads some stuff and
- (void) dismissSettings{
//
// ... Reload some other stuff...
//
//Dismiss the settings panel
[self dismissViewControllerAnimated:YES completion:^{
//
// ... Reload some other stuff...
//
}];
}
最佳答案
原则上,内存警告不会对您的 View Controller 做任何事情,但它会卸载那些当前未在屏幕上显示的 View Controller 的 View 。
在您的特定情况下,我会在您的设置 View Controller 的代码中查找任何可能引用主视图 Controller View 中的内容的内容。如果是这种情况,则在发生内存警告后,该引用可能为 nil。
此外,您应该验证 didReceiveMemoryWarning 方法的实现,看看您是否正在处理关闭该设置 View 可能需要的东西。
在内存不足的情况下,那些“非事件” View Controller 中的所有 View 都将被卸载。由于您的 dismissSettings 方法是在主 Controller 上声明的,因此当它被调用时,您的主视图中的所有元素很可能都是零。我不知道“Reload some other stuff”代码中包含什么样的操作,但我猜想与 View 相关的东西导致方法失败。
我建议将所有与 View 相关的重新加载代码移动到 viewDidAppear 方法,因为它将保证加载 View 。
另一方面,我建议您在实际设置 View Controller 上移动实现 dismiss 方法(记住它应该像 [ self.navigationController dismissModalViewControllerAnimated:YES]; 一样需要关闭导航 Controller )。至少,这是我一直这样做的方式,而且从未让我失望过。逻辑是我不希望非事件 View Controller 运行任何逻辑。
最后,正如您提到的目标是 iOS 5 及更高版本,我强烈建议您将项目转移到 ARC。做起来比看起来容易,而且一旦您开始行动,那真的很棒。
您的问题的另一个可能原因是您正在使用通知调用您的 dismiss 方法,并且您的主 Controller 正在取消订阅 viewDidUnload 方法上的通知。请记住,当低内存条件触发时,将调用 viewDidUnload 方法!
关于objective-c - 内存警告是否会破坏呈现 View Controller ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9033935/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代
给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru
我试图使用yard记录一些Ruby代码,尽管我所做的正是所描述的here或here#@param[Integer]thenumberoftrials(>=0)#@param[Float]successprobabilityineachtrialdefinitialize(n,p)#initialize...end虽然我仍然得到这个奇怪的错误@paramtaghasunknownparametername:the@paramtaghasunknownparametername:success然后生成的html看起来很奇怪。我称yard为:$yarddoc-mmarkdown我做错了什么?
我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby1.9+ 关于ruby-主要:Objectwhenrun
这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife
我正在使用active_admin,我在Rails3应用程序的应用程序中有一个目录管理,其中包含模型和页面的声明。时不时地我也有一个类,当那个类有一个常量时,就像这样:classFooBAR="bar"end然后,我在每个必须在我的Rails应用程序中重新加载一些代码的请求中收到此警告:/Users/pupeno/helloworld/app/admin/billing.rb:12:warning:alreadyinitializedconstantBAR知道发生了什么以及如何避免这些警告吗? 最佳答案 在纯Ruby中:classA
如果您尝试在Ruby中的nil对象上调用方法,则会出现NoMethodError异常并显示消息:"undefinedmethod‘...’fornil:NilClass"然而,有一个tryRails中的方法,如果它被发送到一个nil对象,它只返回nil:require'rubygems'require'active_support/all'nil.try(:nonexisting_method)#noNoMethodErrorexceptionanymore那么try如何在内部工作以防止该异常? 最佳答案 像Ruby中的所有其他对象
最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru
我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案