繁体   English   中英

苹果会因为内存使用量增加而拒绝我的iPhone应用程序吗?

[英]Will Apple reject my iPhone application because of increasing memory usage?

我有一个具有多个视图的应用程序。 它工作正常,没有任何泄漏或崩溃。 但是,当您使用性能工具运行泄漏时,我看到当我切换多个视图并返回到主屏幕时,应用程序的整体大小会增加。 就像在访问4-5个不同的视图并返回到屏幕后其1.53MB会将消耗增加到1.58MB或更少,但绝对大于1.53MB。 我尝试解决此问题,但由于没有内存泄漏,因此无法弄清楚我要去哪里。

有谁知道可能是什么问题?

苹果会在此基础上拒绝我的申请吗?

我会在屏幕之间来回切换很多次(至少一百次)。 如果在此期间内存继续(线性)增长,则您有问题。 如果内存稳定,则可能没问题。

绝对会继续尝试修复您的内存泄漏。 但是,如果它很小,我怀疑苹果会注意到它。 我的意思是,他们自己的应用也会泄漏一些。 您肯定会为此而拒绝。 但实际上,在这里和那里泄漏几个字节不应该阻止它本身的批准。

(来源,批准了2个应用程序,一个存在相同问题,一个很小的内存泄漏我无法追踪。我提交并获得了批准。不久之后,我找到并修复了它,并将其作为更新的一部分发布)。

如果应用程序在进入状态B和从状态B返回后在已知的稳定状态(例如命名为A)上具有增加的内存占用,则该状态对状态A不会产生持久影响,并且没有内存泄漏,这个问题称为(据我所知)挥之不去的记忆。

检查清单以确保是否存在持久的内存问题:

  • 通过Instruments进行分析时,App没有内存泄漏,或者在非系统代码上也没有内存泄漏。
  • 状态A和状态B分别是稳定状态,就像在状态机中一样。 状态B对状态A或内存没有永久影响。 状态A可能是网关,是通往其他状态(如状态B或状态C)的菜单。但是子状态没有关于状态A的信息或信息有限,并且对状态A的更改也没有。
  • 循环状态更改以根状态开始和结束,例如A-> B-> A,A-> C-> A,A-> B-> C-> A; 您会在状态A上遇到增加的内存使用情况。其他子状态下的内存使用情况并不重要。

为了发现并解决此问题,请使用仪器对您的应用程序进行配置。 但是,您应该监视分配和总内存,而不是监视泄漏。 每当您的应用进入状态A(包括启动状态)时,都要进行内存快照。 (有一个用于:D的按钮)快照后进入状态B,状态C,并按预期使用您的应用程序。 返回到根状态后(在此示例中为状态A),再拍一张快照。 仪器将显示快照之间的内存分配和总内存差异增量。 它还将提供有关内存分配给哪个对象以及何时分配的信息。 如果是您的代码,则可能会看到类的类型和分配点。 仪器无法帮助您确定何时应该释放该对象,但是当您获得了挥之不去的对象或内存时,找出释放点应该容易得多。

但! 别忘了:像每个OS一样,OS和Framework代码可能会有泄漏和持久的内存问题。 如果您确定不是代码泄漏或在内存中徘徊,那么一切都很好。 我的应用就是这种情况,并且得到了批准(App:Tusudoku)。 系统功能通常会使用额外的内存(如果有),但在收到内存警告时会立即释放它。 尽管设备的内存有限,但如果仍不使用则会浪费,并且使用内存不会使内存芯片使用可测量的增加的电流。 最佳做法是使用内存达到性能极限,并在有人明确需要时立即释放它。 这些高速缓存内存不会随时间线性增长,但是您应该在应用程序每次进入根状态(在此示例中为状态A)时强制发出内存警告。因此,通过这种方式,您可以确保系统或框架分配的所有高速缓存都将被释放。 ,然后拍摄快照。

AppStore®上的大多数应用程序都有内存泄漏和其他内存问题。 问题是这如何影响用户。 随着速度的增加,加速度迅速下降的非线性挥之不去的记忆通常不会成为拒绝的原因。 计算出一个完美工作的应用程序的内存使用量为15MB,但如果可以正常工作,没问题,请说它将达到20MB的最大限制,您可以使用。 因此,您以后可以解决内存问题。 但是,如果您的应用程序的内存使用率呈线性增长或恶化,并且在需要时无法释放该内存,那将是一个关键问题。

有关内存使用情况的更多信息,请考虑阅读官方文档并观看WWDC视频(这是我使用Instruments了解内存修复的全部信息)。

没有明确的答案。

一方面,事实是,根据发布的策略,您的应用程序可能存在难以理解的内存泄漏,足以拒绝它。

另一方面,苹果公司提交给FCC的文件(在AT&T +苹果公司与Google的垄断之战中)提供了足够的详细信息来确定对应用程序进行审核的费用-除非苹果公司谎称平均应用程序由2个人审核,他们每个人都会花费大约5分38秒(假设Apple没有休息)来确定您的应用是通过还是失败。

因此,答案很大程度上取决于是否可以由业内一些工作过度的测试人员在检查的前5分钟内发现内存泄漏。

如果您在视图中使用UIImageViews,则部分额外的内存可能是它所做的缓存。 这里

有时,当我们加载视图然后切换到另一个视图时,我们会将视图保留在周围。 例如,如果您拥有一个将所有视图作为保留属性的rootviewcontroller。 通常,在删除子视图时,该子视图将被释放,但是如果将其保留在viewcontoller中则不会被释放。 如您所见,这将增加消耗的内存,但不会释放。 它不是泄漏,只是它仅在您释放或删除rootviewcontroller时才释放。

您可以尝试遍历并找到将内存捆绑在一起的位置,或者可以基于浏览视图的额外速度来证明它的合理性,而不必等待它们重新加载。

总而言之,很高兴知道为什么视图和其他对象会占用并保留在内存中,但是您可能会发现所有这些用法都是合理的,并且您希望以这种方式进行处理。 话虽如此,我不认为苹果会拒绝我们的应用做出这样的决定。 如果您的应用由于内存使用而崩溃,那么它将被拒绝。

您正在描述非常典型的内存使用情况。

如果您的应用程序在测试时内存不足并崩溃了,他们将拒绝它。 除此之外,您还可以。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM