關於理解記憶體管理
1、什麼是引用計數(referencecount)
簡單而有效的管理物件生命週期的方式。不管是oc還是swift,記憶體管理的方式都是基於引用計數來管理的。
2、引用計數是如何工作的
首先先讓我們來說明下,以前的工程使用的時候是mrc,現在xcode新建之後肯定是arc的,那我們可以通過工程配置來修改
或者是給類新增 -fno-objc-arc編譯引數來修改啟動手工管理引用計數的模式。
讓我們來看下下面的**:
nslog(@"reference count = %u",[object
retaincount]);
nsobject *another = [object
retain];
nslog(@"reference count = %u",[object
retaincount]);
[another release];
nslog(@"reference count = %u",[object
retaincount]);
[object
release];
當我們建立乙個新物件的時候,這個物件的引用計數會加1,當有乙個新的指標指向這個物件的時候,會將其引用計數加1,當不指向這個指標是,其引用計數會減1,當引用計數釋放時,計數會為0,那麼物件會給銷毀,**記憶體,那麼問題來了!我們在工程列印出來是為什麼會是1呢?
在巧神的書上看到的解釋是:其實引用計數的管理方式和linux檔案系統裡面的硬鏈結一樣,當你釋放的時候,系統就知道要馬上**這個記憶體了,沒有必要在retaincount –1 ,不管減不減1,該物件肯定會被**,然而物件被**後,它的所有記憶體區域,包括retaincount值也變的沒有意義了,不把1變為0可以減少一次記憶體操作,加快物件的**。
3、使用管理記憶體的的原則
誰申請有誰釋放
4、如果舊專案會引出迴圈引用問題,我們可以用xcode自帶的leaks來進行檢查,如下圖所示:這個是我測試迴圈引用的截圖
首先:
然後選擇:
下面執行後紅色的線就是迴圈引用問題:
具體我們可以看到在那個類的方法上出現了迴圈引用
5、corefoundation物件的記憶體管理
底層的corefoundation物件,大多數是以***createwith***這樣的方式建立的,例如:
cfstringref str = cfstringcreatewithcstring(kcfallocatordefault, "hahah", kcfstringencodingutf8);
ctfontref fontref = ctfontcreatewithname((cfstringref)@"arialmt", 14.0f, null);
這些物件的引用計數修改要相應的使用cfretain 和 cfrelease 方法
cfretain(str);
cfrelease(str);
這兩個的使用和retain和release一樣。
在使用的過程中,需要將乙個corefoundation物件轉換為乙個oc物件,
* __bridge: 只做型別轉換,不修改相關物件的引用計數,原來的corefoundation物件在不用時,需要呼叫cfrelease。
* __bridge_retained:型別轉換後,將該物件引用計數加1,原來的corefoundation物件在不用時,需要呼叫cfrelease。
* __bridge_transfer:型別轉換後,將該物件的引用計數交給arc管理,corefoundation物件在不用時,不需要呼叫cfrelease。
以上是學習到的知識點整理,如有不對,請廣大朋友指點。
關於記憶體管理
簡單的理解,可以將記憶體分為三個部分 靜態區,棧和堆,三個部分都有自己的許可權,不可以隨便讀寫。靜態區 儲存自動全域性變數和static變數,靜態區的內容在總的程式的生命週期都存在,由編譯器在編譯的時候分配。棧 儲存區域性變數。棧上的內容只在函式的範圍內存在,當函式結束,這些內容也會被自動銷毀,效率...
關於記憶體管理
什麼是記憶體管理?是指軟體執行時對計算機記憶體資源的分配和使用技術。其最主要的目的就是如何高效 快速的分配,並且在適當的時候釋放和 記憶體資源。在 ios 中資料是存在堆和棧中的,然而我們的記憶體管理管理的是堆上的記憶體,棧上的記憶體並不需要我們管理。引用計數是計算機程式語言中的一種記憶體管理技術,...
關於記憶體管理
記憶體管理涉及根據資料庫更改的需求為oracle database例項記憶體結構維護最佳大小。必須管理的記憶體結構是系統全域性區域 sga 和例項程式全域性區域 例項pga oracle資料庫支援各種由初始化引數設定選擇的記憶體管理方法。oracle建議您啟用稱為自動記憶體管理的方法。自動記憶體管理...