iPhone開發資料之內存管理 ,循環引用導致的內存問題

iPhone開發資料之內存管理 ,循環引用導致的內存問題

https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmPractical.html#//apple_ref/doc/uid/TP40004447

?

http://en.wikipedia.org/wiki/Reference_counting

【IT168 技術文檔】開發iPhone 應用程序并不難,基本上就是三個詞 - “memory, memory, memory” 。iPhone OS 對內存的要求很嚴格,有memory leak ,殺掉;內存使用超限額,殺掉。一個經過測試的程序,在使用過程中90%以上的崩潰都是內存問題造成的。在這里簡單總結一下Object-C 內存管理。

  基本概念

  Object-C 的內存管理基于引用計數(Reference Count)這種非常常用的技術。簡單講,如果要使用一個對象,并希望確保在使用期間對象不被釋放,需要通過函數調用來取得“所有權”,使用結束后再調用函數釋放“所有權”。“所有權”的獲得和釋放,對應引用計數的增加和減少,為正數時代表對象還有引用,為零時代表可以釋放。

  函數

  獲得所有權的函數包括

  * alloc - 創建對象是調用alloc,為對象分配內存,對象引用計數加一。

  * copy - 拷貝一個對象,返回新對象,引用計數加一。

  * retain - 引用計數加一,獲得對象的所有權。

  另外,名字中帶有alloc, copy, retain 字串的函數也都認為會為引用計數加一。

  釋放所有權的函數包括

  * release - 引用計數減一,釋放所有權。如果引用計數減到零,對象會被釋放。

  * autorelease - 在未來某個時機釋放。下面具體解釋。

  autorelease

  在某些情況下,并不想取得所有權,又不希望對象被釋放。例如在一個函數中生成了一個新對象并返回,函數本身并不希望取得所有權,因為取得后再沒有機會釋放(除非創造出新的調用規則,而調用規則是一切混亂的開始),又不可能在函數內釋放,可以借助autorelease 。所謂autorelease , 可以理解為把所有權交給一個外在的系統(這個系統實際上叫autorelease pool),由它來管理該對象的釋放。通常認為交給 autorelease 的對象在當前event loop 中都是有效的。也可以自己創建NSAutoreleasePool 來控制autorelease的過程。

  據蘋果的人說,autorelease效率不高,所以能自己release的地方,盡量自己release,不要隨便交給autorelease來處理。

  規則

  引用計數系統有自己的引用規則,遵守規則就可以少出錯:

  * 獲得所有權的函數要和釋放所有權的函數一一對應。

  * 保證只有帶alloc, copy, retain 字串的函數才會讓調用者獲得所有權,也就是引用計數加一。

  * 在對象的 dealloc函數中釋放對象所擁有的實例變量。

  * 永遠不要直接調用dealloc來釋放對象,完全依賴引用計數來完成對象的釋放。

  有很多類都提供“便利構造函數(convenience constructors)”,它們創建對象但并不增加引用計數,意味著不需要調用release來釋放所有權。很好辨認,它們的名字中不會有alloc和copy。

  只要遵守這些規則,基本上可以消除所有Intrument可以發現的內存泄露問題。

  容器

  類似NSArray, NSDictionary, NSSet 等類,會在對象加入后引用計數加一獲得所有權,在對象被移除或者整個容器對象被釋放的時候釋放容器內對象的所有權。類似的情況還有UIView對 subview的所有權關系,UINavigationController對其棧上的controller的所有權關系等等。

  其他所有權的產生

  還有一些用法會讓系統擁有對象的所有權。比如NSObject 的performSelector:withObject:afterDelay 。如果有必要,需要顯示的調用cancelPreviousPerformRequestsWithTarget:selector:object: ,否則有可能產生內存泄露。

  因這種原因產生的泄露因為并不違反任何規則,是Intrument所無法發現的。

  循環引用

  所有的引用計數系統,都存在循環應用的問題。例如下面的引用關系:

  * 對象a創建并引用了對象b.

  * 對象b創建并引用了對象c.

  * 對象c創建并引用了對象b.

  這時候b和c的引用計數分別是2和1。當a不再使用b,調用release釋放對b的所有權,因為c還引用了b,所以b的引用計數為1,b不會被釋放。b不釋放,c的引用計數就是1,c也不會被釋放。從此,b和c永遠留在內存中。

  這種情況,必須打斷循環引用,通過其他規則來維護引用關系。比如,我們常見的delegate往往是assign方式的屬性而不是retain方式的屬性,賦值不會增加引用計數,就是為了防止delegation兩端產生不必要的循環引用。如果一個UITableViewController 對象a通過retain獲取了UITableView對象b的所有權,這個UITableView對象b的delegate又是a,如果這個 delegate是retain方式的,那基本上就沒有機會釋放這兩個對象了。自己在設計使用delegate模式時,也要注意這點。

  因為循環引用而產生的內存泄露也是Instrument無法發現的,所以要特別小心。

posted on 2012-06-06 18:05 linyawen 閱讀(...) 評論(...) 編輯 收藏

轉載于:https://www.cnblogs.com/linyawen/archive/2012/06/06/2538622.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/260743.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/260743.shtml
英文地址,請注明出處:http://en.pswp.cn/news/260743.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python能做大型游戲嗎_python有做大型游戲的潛力嗎?

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。 豈止是有潛力,簡直是很合適! 豬廠兩大游戲客戶端引擎,NeoX 和 Messiah,都使用 Python 作為腳本語言。 你最近所了解的比較火的掛著豬廠旗號的&a…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波2 - 復數、傅里葉級數、連續單變量函數的傅里葉變換、卷積

目錄基本概念復數傅里葉級數沖激函數及其取樣(篩選)性質連續單變量函數的傅里葉變換卷積基本概念 復數 復數CCC的定義為 CRjI(4.3)C R jI \tag{4.3}CRjI(4.3) R,IR,IR,I為實數,RRR是實部,III是虛部,j?1j \sqrt{-…

不要迷失在技術的海洋中【轉】

轉自http://www.cnblogs.com/lovecherry/archive/2007/10/28/940555.html 不要迷失在技術的海洋中 技術就好像一片汪洋大海,越深入越望不到邊際。就拿自己的體驗來說吧,2000年的時候在學校搞ASP,覺得網頁開發就是這么簡單,把數據庫…

使用代碼設置Item級的權限(權限總結1)

itle in english:set Item Level Permission for SharePoint (MOSS/WSS) List/Document Library Programmatically 有些時候,我們需要為文檔庫里面某個文件設置特殊的權限,這個權限不繼承自列表權限,當然最簡單的最好是再創建一個列表&#…

echarts 4.0.4怎么下載_怎么讓ECharts的提示框tooltip自動輪播?

1. 怎么讓ECharts的提示框tooltip自動輪播?在用ECharts做大屏或者可視化展示項目的時候,讓提示框tooltip自動輪播是比較常見的需求,給大家推薦一個插件叫echarts-tooltip-auto-show,名字是有點長,但是挺好用的。在hover顯示tooltip之后&…

[React Native]高度自增長的TextInput組件

之前我們學習了從零學React Native之11 TextInput了解了TextInput相關的屬性。 在開發中,我們有時候有這樣的需求, 希望輸入區域的高度隨著輸入內容的長度而增長, 如下: 這時候我們需要自定義一個組件: 在項目中創建AutoExpandingTextInput.js import …

網站開啟Gzip壓縮-apache

找到并打開apache/conf目錄中的httpd.conf文件 httpd.conf中打開deflate_Module和headers_Module模塊,具體做法為將 如下兩句前面的#去掉:LoadModule deflate_module modules/mod_deflate.so LoadModule headers_module modules/mod_headers.so 3.配置文…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波3 - 取樣和取樣函數的傅里葉變換、混疊

目錄取樣和取樣函數的傅里葉變換取樣取樣后的函數的傅里葉變換取樣定理混疊由取樣后的數據重建(復原)函數取樣和取樣函數的傅里葉變換 取樣 fˉ(t)f(t)sΔT(t)∑n?∞∞f(t)δ(t?nΔT)(4.27)\bar f(t) f(t)s_{\Delta T}(t) \sum_{n-\infty}^{\infty}…

[轉]Android開發,實現可多選的圖片ListView,便于批量操作

本文轉自:http://www.cnblogs.com/gergulo/archive/2011/06/14/2080629.html 之前項目需要實現一個可多選的圖片列表,用戶選中一到多張圖片后,批量上傳。但是網上有可多選普通列表的代碼、也有單純圖片列表的代碼,卻沒有兩者合并的…

個人信息安全影響評估指南_發布 | 網絡安全標準實踐指南—移動互聯網應用程序(App)收集使用個人信息自評估指南...

關于發布《網絡安全標準實踐指南—移動互聯網應用程序(App)收集使用個人信息自評估指南》的通知信安秘字[2020] 40號各有關單位:為落實《網絡安全法》相關要求,圍繞中央網信辦、工信部、公安部、市場監管總局聯合制定的《App違法違規收集使用個人信息行為…

Go的50度灰:Golang新開發者要注意的陷阱和常見錯誤

Go的50度灰:Golang新開發者要注意的陷阱和常見錯誤 http://colobu.com/2015/09/07/gotchas-and-common-mistakes-in-go-golang/

android intent和intent action大全

不管是頁面牽轉,還是傳遞數據,或是調用外部程序,系統功能都要用到intent。 在做了一些intent的例子之后,整理了一下intent,希望對大家有用。 由于intent內容太多,不可能真的寫全,難免會有遺落&a…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波4 - 單變量的離散傅里葉變換DFT

目錄標題單變量的離散傅里葉變換由取樣后的函數的連續變換得到DFT取樣和頻率間隔的關系單變量的離散傅里葉變換 由取樣后的函數的連續變換得到DFT 對原函數的變換取樣后的業的發展的變換F~(μ)\tilde F(\mu)F~(μ),但未給出取樣后的函數f~(t)\tilde f(t)f~?(t)的…

在線生成 CSS3 的工具

1) CSS Creator – Layout Design 2) CSS Menu Maker 3) CSS3 Please 4) CSS3 Generator 5) CSS Border Radius 6) CSS3 Gradient Generator 7) CSS3 Button Generator 8 ) Mike Plate’s CSS3 Playground 9) Border Image Generator 10) CSS3 WRAP 11) Button Maker 12) Font…

python image 轉成字節_就是這么牛!三行Python代碼,讓數據處理速度提高2到6倍

本文可以教你僅使用 3 行代碼,大大加快數據預處理的速度。Python 是機器學習領域內的首選編程語言,它易于使用,也有很多出色的庫來幫助你更快處理數據。但當我們面臨大量數據時,一些問題就會顯現……在默認情況下,Pyth…

sessionStorage 、localStorage 和 cookie 之間的區別(轉)

essionStorage 、localStorage 和 cookie 之間的區別(轉) 2012-05-08 14:29:19| 分類: HTML5CSS3WEBAPP|舉報|字號 訂閱 sessionStorage 和 localStorage 是HTML5 Web Storage API 提供的,可以方便的在web請求之間保存數據。有了本地數據,…

刪除文件夾里的圖片,打印刪除日志

1 #region 僵尸文件夾中的文件如果不在活文件列表中&#xff0c;刪之2 List<string> deadfile new List<string>();3 foreach(string str in lstZombileDic)4 {5 if(Direct…

第4章 Python 數字圖像處理(DIP) - 頻率域濾波5 - 二變量函數的傅里葉變換、圖像中的混疊、二維離散傅里葉變換及其反變換

目錄二變量函數的傅里葉變換二維沖激及其取樣性質二維連續傅里葉變換對二維取樣和二維取樣定理圖像中的混疊二維離散傅里葉變換及其反變換二變量函數的傅里葉變換 二維沖激及其取樣性質 兩個連續變量的沖激函數定義為&#xff1a; δ(t,z){1,tz00,others(4.52)\delta(t, z) …

巧用VC工程下的rc文件

巧用VC工程下的rc文件(發表時間: 2008-12-30 17:20:00) 【評論】 【打印】 【字體&#xff1a;大 中 小】 本文鏈接&#xff1a;http://blog.pfan.cn/miaowei/40117.html 復制鏈接 分享到&#xff1a; 0標簽:VC rc文件 資源文件 窗口尺寸設置 添加資源 縱觀真個的VC工程&a…

藍橋杯 參考題目 黃金隊列(水題)

黃金分割數0.618與美學有重要的關系。舞臺上報幕員所站的位置大約就是舞臺寬度的0.618處&#xff0c;墻上的畫像一般也掛在房間高度的0.618處&#xff0c;甚至股票的波動據說也能找到0.618的影子.... 黃金分割數是個無理數&#xff0c;也就是無法表示為兩個整數的比值。0.618只…