記憶體管理

来源:http://www.cnblogs.com/xueyao/archive/2016/02/14/5188408.html
-Advertisement-
Play Games

iOS記憶體管理的方式是引用計數機制。分為MRC(人式引用計數)和ARC(自動引用計數)、 為什麼要學習記憶體管理? 記憶體管理方式是引用計數機制,通過控制對象的引用計數來實現操作對象的功能。一個對象的生命周期有生成,持有,釋放,銷毀。引用計數分為ARC,MRC,在MRC中,增加引用計數的方法是retai


iOS記憶體管理的方式是引用計數機制。分為MRC(人式引用計數)ARC(自動引用計數)、

為什麼要學習記憶體管理?

記憶體管理方式是引用計數機制,通過控制對象的引用計數來實現操作對象的功能。一個對象的生命周期有生成,持有,釋放,銷毀。引用計數分為ARC,MRC,在MRC中,增加引用計數的方法是retain,alloc,new,copy。減少引用計數的方法是release, autorelease,當引用計數增減平衡的時候,系統會自動執行對象的dealloc方法,銷毀對象,完成該對象的記憶體管理。有創建就必須有釋放。

 1.養成良好的記憶體管理習慣,可以從源頭上避免記憶體問題的出現。

 2.一旦出現記憶體問題,能夠找到並用解決。(調試bug

引用計數管理記憶體的理念是:通過控制記憶體或者對象的引用計數來實現生成,持有,釋放,銷毀對象的操作。

 1.生成,對象的引用計數從01   - > 比如alloc

 2.持有,增加一個引用,讓對象的引用計數加1   - >比如 retain

 3.釋放,減少一個引用,讓對象的引用計數減1   - > 比如 release  autorelease

 4.銷毀,當對象的引用計數為0時,系統就會回收這個記憶體空間。  - > 比如 dealloc

 當這塊空間被系統回收之後 ,就不能通過指針去訪問這塊空間了,容易造成野指針。

 切記!!引用計數這個概念,只存在於堆區區域,針對堆區的對象。

 生成,對應的方法是 + (instancetype)alloc; 在堆區域開闢一塊記憶體空間,存放對象,並且將記憶體清零,同時將此對象的引用計數變為1,是從01的過程。

   //0 -> 1

    Person *person = [[Person alloc] init];

    //retainCount 這個方法可以查看對象的引用計數

    NSLog(@"person is %p, person's retainCount is %lu",person, [person retainCount]);

   

   //1

    Person *p1 = person;

    NSLog(@"p1 is %p, p1's retainCount is %lu", p1, [p1 retainCount]);

    //持有, 方法是 retain,讓對象的方法加1

    //1 -> 2

    [person retain];

    NSLog(@"person is %p, person's retainCount is %lu",person, [person retainCount]);

    

    //2 -> 3

    [p1 retain];

    NSLog(@"p1 is %p, p1's retainCount is %lu", p1, [p1 retainCount]);

    

    //3 -> 4

    Person *p2 = [p1 retain];

    NSLog(@"p2 is %p, p2's retainCount is %lu", p2, [p2 retainCount]);

    

    //釋放 release,讓對象的引用計數減1 ,而且是立即減1

    [person release];

    NSLog(@"%lu",[person retainCount]);

    [person release];

    [person release];

    NSLog(@"%lu",[person retainCount]);

    [person release];//在執行這條release消息之前,對象person的引用計數為1release之後,引用計數為0,此時系統會自動試行dealloc方法,釋放person對象,來完成person對象的記憶體管理。

    //下麵這行代碼可以列印出retainCount,為1,因為系統內部引用計數的值沒有00只是方便交流引入的一個數,但從本質上來說, 這行代碼已經有可能造成了野指針,因為person對象已經被系統回收,再去訪問[person retainCount]就會出現問題。

    //野指針崩潰,是因為被回收的記憶體空間已經被占用了,再去訪問會出現問題,不崩潰,只是僥幸,這塊被回收的記憶體空間現在還沒有被占用。

autorelease 此方法也是讓對象的引用計數減1,不過區別於releaseTA並不是立即減1,而是在未來的某個時刻,觸發減1操作的這個時刻與自動釋放池息息相關。

自動釋放池是一個容器,來記錄池子內部對象接收到的autorelease消息,哪個對象接收,接收了幾次,誰先接收,誰後接收,當池子釋放時,autorelease消息真正執行減1操作。

- (void)dealloc{

    NSLog(@"我的天,%@已經被釋放了",self);

    [super dealloc]; 

}只要重寫了dealloc,[super dealloc]永遠都在最後一行。先將自身的實例變數釋放掉,然後再去執行父類中的dealloc方法,釋放,繼承過來的實例變數。dealloc方法釋放的順序,正好與初始化方法,初始化順序相反。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 前言 年前剛剛離職了,分享下我曾經出過的一道面試題,此題是我出的一套前端面試題中的最後一題,用來考核面試者的JavaScript的綜合能力,很可惜到目前為止的將近兩年中,幾乎沒有人能夠完全答對,並非多難只是因為大多面試者過於輕視他。 題目如下: function Foo() { getName =
  • Velocity.js官網:http://julian.com/research/velocity/ 相容IE8和Android2.3 Velocity.js基本用法 效果圖: CSS .box{ width:100px; height:100px; background-color:pink; }
  • var CalendarData=new Array(100); var madd=new Array(12); var tgString="甲乙丙丁戊己庚辛壬癸"; var dzString="子醜寅卯辰巳午未申酉戌亥"; var numString="一二三四五六七八九十"; var monSt
  • 具體可參考紅皮書第三版中的6.2.4章 書中的例題詳細講解了什麼是原型模式 function fop(){}; fop.prototype.name="xiaohong"; fop.prototype.age="12"; fop.prototype.sayName=function(){ conso
  • 閑聊:新年第一天上班,看著自己15年年底寫的代碼,真心覺得很爛,因為年底沒時間去寫,一想著做後臺管理需要獲取一周的開始和結束日期,就慌了,項目趕著測試呢,還有好多事情未做,就直接抄襲了網上的一段錯誤代碼,其實真的很簡單,今天重新花點時間封裝一下,以備後用,大神勿噴,謝謝! 一、封裝為jQuery版日
  • var numbers = [5, 458 , 120 , -215 , 228 , 400 , 122205, -85411]; numbers = numbers.sort(function(){ return Math.random() – 0.5}); /* numbers 數組將類似於 [
  • function generateRandomAlphaNum(len) { var rdmString = ""; for( ; rdmString.length < len; rdmString += Math.random().toString(36).substr(2));return rd
  • 文檔對象模型DOM(Document Object Model)定義訪問和處理HTML文檔的標準方法。 DOM 將HTML文檔呈現為帶有元素、屬性和文本的樹結構(節點樹)。 把上面的代碼拆分為Dom節點圖 如圖: 三種常見的DOM節點: 1.元素節點: 比如:html、h2、p、ul、li 即標簽
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...