簡體   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