我有一个包含多个视图的应用程序。它工作得很好,没有任何泄漏或崩溃。但是当你使用性能工具运行泄漏时,我看到当我切换多个视图并回到主屏幕时,我的应用程序整体大小会增加。就像它在访问4-5个不同视图并返回屏幕后的1.53MB一样,将功耗增加到1.58MB或更低但绝对大于1.53MB。 我尝试解决这个问题,但由于没有内存泄漏,因此无法弄清楚我的错误。
有谁知道可能是什么问题?
苹果会否在此基础上拒绝我的申请?
答案 0 :(得分:1)
我会在屏幕之间往返很多次(至少一百次)。如果在此期间内存继续增长(线性),则会出现问题。如果内存稳定,你可能没问题。
答案 1 :(得分:1)
一定要不断尝试修复内存泄漏。但如果它很小,我怀疑苹果会注意到它。我的意思是,他们自己的应用程序也会泄漏。你肯定会被拒绝。但实际上,在这里泄漏几个字节并不应该阻止自己的批准。
(来源,2个应用程序获得批准,其中一个有相同的问题,我无法追踪的微小的内存泄漏。我提交并获得批准。不久之后,我发现并修复了它并将其作为一部分发布更新)。
答案 2 :(得分:1)
如果某个应用程序在已知稳定状态下的内存占用量增加,例如在进入和返回状态B之后命名为A,这应该对状态A没有持久影响并且没有内存泄漏,则会调用此问题(尽可能多)据我所知)记忆犹新。
检查清单以确定是否存在延迟记忆问题:
要发现并解决此问题,请使用仪器配置您的应用。但是,不应监视泄漏,而应监视分配和总内存。每当您的应用程序进入状态A(包括启动)时,请拍摄内存快照。 (有一个按钮:D)快照转到状态B,状态C并按原样使用您的应用程序。返回根状态后,在此示例状态A中,拍摄另一个快照。仪器将显示快照之间的内存分配和总内存差异增量。它还将提供有关内存分配的对象以及可能时间的信息。如果是您的代码,您可能会看到类和分配点的类型。仪器无法帮助您了解对象何时应该被释放,但是当您获得延迟的对象或内存时,找出释放点应该更容易。
BUT!不要忘记: 操作系统和框架代码可能会像每个操作系统一样出现泄漏和延迟内存问题。如果你确定它不是你的代码泄漏或在内存中挥之不去,一切都很好。我的应用程序就是这种情况,它得到了批准(App:Tusudoku)。如果可用,系统功能通常会使用额外的内存,但是当收到内存警告时它们立即释放它。虽然设备的内存有限,但如果仍未使用则会浪费,并且使用内存不会使内存芯片使用可测量的增加的电流。使用内存达到性能极限,并在有人确实需要时立即释放它,这是最好的做法。这些高速缓存存储器不会随着时间的推移而线性增长,但是每次应用程序进入根状态时都应强制执行内存警告,在此示例中为状态A.因此,您将确保系统或框架分配的任何高速缓存内存都将被释放,然后你拍摄快照。
AppStore®上的大多数应用都存在内存泄漏和其他内存问题。问题是这会如何影响用户。非线性延迟存储器在增加速度时快速下降的加速度通常不会成为拒绝的原因。计算一个完美的应用程序的内存使用量为15MB,但如果它有效,没问题,说它将达到最大20MB的限制,你很高兴。所以你以后修复你的记忆问题。如果您的应用程序具有线性或更差的内存使用量并且在需要时无法释放存储器,那么这将是一个关键问题。
有关内存使用的更多信息,请考虑阅读官方文档并观看WWDC视频(这是我使用仪器学习所有内存修复的地方)。
答案 3 :(得分:0)
没有一成不变的答案。
一方面,您的应用程序可能有一个模糊的内存泄漏,足以根据发布的策略拒绝它。
另一方面,Apple提交给FCC的文件(在AT& T + Apple与谷歌垄断斗争中)提供了足够的细节,以确定审查应用程序有多少 - 除非Apple谎称平均应用程序是由2个人审核,每个人花费大约5分38秒(假设Apple没有休息)来确定您的应用程序是否通过。
所以答案在很大程度上取决于是否可以在业内一些劳累过度的测试人员检查的前5分钟内发现这种内存泄漏。
答案 4 :(得分:0)
如果您在视图中使用UIImageViews,那么额外内存的一部分可能是它所执行的缓存。请参阅here。
有时当我们加载视图,然后切换到另一个视图时,我们会离开视图。例如,如果您有一个rootviewcontroller,它将所有视图都保留为保留属性。通常,当您删除子视图时,它会被释放,但如果您将其保留在viewcontoller中则不会。正如你可以看到的那样,这会增加消耗的内存,但不会被释放。它不是泄漏,只有在释放或删除rootviewcontroller时它才会被释放。
您可以尝试查找内存与此类情况相关的位置,或者您可以根据浏览视图的增加速度来证明这一点,而无需等待它们重新加载。
总之,很高兴知道你的视图和其他对象为什么消耗和保留内存,但你可能会发现所有这些用法都是合理的,并且你想保持这种方式。话虽如此,我认为Apple不会拒绝我们的应用程序来做出这样的决定。如果您的应用因内存使用而崩溃,那么这会被拒绝。
答案 5 :(得分:0)
您正在描述非常典型的内存使用情况。
如果您的应用在内存耗尽并且在测试时崩溃,他们会拒绝它。除此之外,你很好。