簡體   English   中英

自動釋放iPhone

[英]Autorelease iPhone

即將結束開發iPhone應用程序,我想知道在開發iphone時使用自動釋放有多糟糕。 我遇到了一些相當隨機的崩潰,到目前為止,除了內存使用不當之外,我無法指出它。

作為一個Cocoa新手我記得最初閱讀一份指南文件,強烈建議避免自動釋放,支持手動保留/釋放iPhone。 然而,一個更“高級”的Cocoa開發人員很早就加入進來(具有諷刺意味的是,自那以后一直放手),他們在整個地方都使用了自動釋放。 不可否認,我進入了“猴子看猴子做”模式,它似乎又回來困擾我(我現在是項目中唯一的開發人員)。

那下一步該怎么辦? 在我看來,我必須分支代碼並嘗試通過並在可能的情況下替換自動釋放代碼保持我的手指交叉,我不會無意中破壞應用程序。 似乎很多庫調用都會導致自動釋放的對象,比如stringWithFormat,以及我自己不使用alloc的任何東西。 我應該注意的任何其他的getchyas和/或建議? 謝謝可可大師。

使用release而不是autorelease可以提高緊張點的內存使用率(這在iPhone上很好),但如果你沒有遵循保留/釋放規則,它就不會對崩潰有所幫助。 我會在Obj-C中閱讀一些關於內存管理的教程,如果你對你應該做的事情仍然有點朦朧,然后使用調試器和崩潰報告來查找那些崩潰,找出你在釋放對象的位置。 是兩個好的開始。

比自動釋放或手動釋放的選擇,更重要的是你如何往往allocdeallocNSAutoreleasePool秒。 由於大多數Cocoa框架都使用autorelease ,因此您需要有適當的池排放策略。 一旦到位,選擇是否releaseautorelease變得不那么成問題。

話雖這么說,你應該擔心的唯一領域是緊密循環 - 每隔幾次迭代分配和釋放一個NSAutoreleasePool以獲得最佳結果; 而當你已經衍生出了另一NSThread不具有Runloop -創建一個游泳池和排它每隔一段時間變為空閑。 由於大多數應用程序每個事件只分配少量數據,因此UIKit在調度事件之前分配池的策略以及在調度返回之后釋放它的策略非常有效。

如果您認為自己不知道如何使用自動釋放,請在iTunes U上查看CS193p FALL 2010 - >第4講。

它教你所有關於內存管理和東西(如果你跳過前10分鍾左右)

當你自動發布時,你基本上會說:“我不再需要這個,但是其他任何人都可以自由選擇它(在自動釋放池耗盡之前)”。 當你明確地重新發送你所說的一個對象時:“我不再需要它了,除非其他人已經另有說明(獲得),否則應該立即解除分配。”

因此,自動釋放通常不是錯誤的。 當您想要將對象傳遞回郵件的發件人而不要求發件人負責釋放對象時,它是必需的。

使用自動釋放池意味着您可能會留下一些未使用的內存。 由於iPhone的內存較少,如果您盡快釋放不需要的內存,而不是讓它在等待自動釋放時占用資源,則可能會提高性能。

出於iPhone性能原因,Apple建議盡可能不使用自動釋放的對象。 而是在完成對象后明確釋放它們。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM