我正在开发一款至少以3g为目标的ios游戏.我们正在将高清资产用于视网膜显示设备(iphone 4,ipod touch 4th gen).
记忆方面,Ipod Touch 4th gen似乎是我们最受约束的设备,因为它具有与3gs相同的RAM(256与Iphone 4的512相比),但我们正在使用HD资产.该应用程序曾经在尝试加载100-110mb的ram时崩溃,但现在我们已经降到70MB,我们从来没有加载崩溃.
经过大量的搜索后,似乎没有官方的硬限制,那么我们应该如何知道要使用什么内存预算才能安全?我们希望能够为艺术家提供他们可以使用的预算,而不必担心每张地图的内存问题.
我开发了一个简单的位置感知iPhone应用程序,除了在手机的低内存条件下,它在功能上非常符合我们的期望.
在手机内存不足的情况下我的应用程序崩溃了.如果我通过释放一些空间来增加手机内存,它会再次开始正常工作而不会发生任何崩溃.
当我在搜索问题时,我发现在低内存条件下操作系统会将didReceiveMemoryWarning发送到当前层次结构中的所有控制器,这样每个控制器都应该实现didReceiveMemoryWarning方法,并将iboutlet设置为nil.目前不可见.
我还读过一些地方,如果该控制器的视图不可见,将调用带有nil参数的方法setView,如果有一些附加到视图的出口变量,则删除它们会有问题.
因此,对于所有这些基金,通过实现didReceiveMemoryWarning和viewDidUnload方法处理Iphone引发的低级内存条件是最好的 .
如果可能,请提供适当的示例或链接以解决上述问题.
谢谢.
我正在评估切换到ARC(自动引用计数)和重构以应用于我的代码.在我必须弄清楚的事情中,有这样的:
如果ARC不允许显式释放对象,我该怎么办didReceiveMemoryWarning?目前,我使用该方法释放属于我的控制器的对象,并且可以通过惰性getter轻松检索:
- (void)didReceiveMemoryWarning {
[_foo release]; _foo = nil;
[super didReceiveMemoryWarning];
}
Run Code Online (Sandbox Code Playgroud)
和相对懒惰的吸气剂:
- (Foo *)foo {
if (_foo) {
return _foo;
}
return (_foo = [[Foo alloc] init]);
}
Run Code Online (Sandbox Code Playgroud)
在ARC中实现这样的"模式"似乎是不可能的...所以,我该怎么办?在ARC中,didReceiveMemoryWarning应被视为"已弃用"/无用吗?
背景:
我有一个标签栏应用程序.每个选项卡都包含导航控制器,允许用户从一个视图转换到另一个视图,显示数据的向下钻取信息(每个视图由视图控制器处理,每个视图控制器类都有didReceiveMemoryWarning方法).通过从Web服务中提取数据来填充列表.
问题:
当我使用iPhone模拟器的"硬件>模拟内存警告"选项时,didReceiveMemoryWarning将为所有视图控制器调用该方法 - 即使是用户正在查看的控制器.我不想清除活动视图控制器正在使用的任何内容.我怎样才能做到这一点?
由于内存警告,在数据发布后,哪种方法应该重新加载数据?(我看到viewDidLoad当用户返回到该视图时,包含表视图调用方法的视图控制器类,但如果视图包含(比如UIWebView),viewDidLoad则不调用方法.为什么会这样?)
编辑(2009年1月30日星期五 - 03:10 PM)
(注意:我正在使用"界面"构建器来创建视图,并且loadView方法已被注释掉.)
因此,当视图控制器收到内存警告消息时,这些是执行的步骤:
以下方法称为:
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
}
Run Code Online (Sandbox Code Playgroud)由于调用[super didReceiveMemoryWarning],[self setView:nil]自动调用?
如果应清除任何资源,setView则应覆盖方法以清除本地资源.
[self setView:nil]如果视图当前处于活动状态,则不会调用(默认情况下).对? - 我真的很好奇哪种方法可以做出这个决定以及如何做出决定?
可以请你确认一下.另外,我在这种方法myObject = nil后遇到错误,但myObject在dealloc控制器类的方法中释放后添加修复了问题.谢谢.