Objective C高階程式設計之記憶體管理 1

2021-06-28 09:30:38 字數 2388 閱讀 1822

1、什麼是arc

顧名思義,自動引用計數是指記憶體管理中採用自動計數的技術。

蘋果官方文件:在obj-c中,採用arc,讓編譯器進行記憶體管理,就無需鍵入release和retain相關**,可以降低崩潰和記憶體洩露風險的同時,很大程度減少開發的工作量。

使用前提:xcode 4.2以上 llvm3.0以上 設定編譯器arc有效。

2、rc的記憶體管理和思考方式

有乙個辦公室,裡面有a,b,c三個工位,如果有人在辦公室就需要開燈,否則就需要關閉。我們如何確定電燈是否需要開啟或關閉。我們可以記錄乙個需要使用電燈的人的數量,當沒有人需要使用電燈的時候,燈光關閉。

a來上班需要使用電燈,需要使用電燈人數+1                                    需要使用電燈人數:1

有人需要使用電燈,電燈開啟

b來上班需要使用電燈,

需要使用電燈人數+1                                    需要使用電燈人數:2

c來上班需要使用電燈,

需要使用電燈人數+1                                    需要使用電燈人數:3

b下班不需要使用電燈,需要使用電燈人數-1                                    需要使用電燈人數:2

a下班不需要使用電燈,

需要使用電燈人數-1                                     需要使用電燈人數:1

c下班不需要使用電燈,

需要使用電燈人數-1                                    需要使用電燈人數:0

沒人需要使用電燈 ,電燈關閉

這樣我們就實現了通過定義乙個需要使用電燈人數的變數,來管理電燈的開關。

乙個正確的rc思想應該是如下方式:

1、自己建立的物件自動持有,使用,使用完,自己取消持有

2、不是自己建立的物件,先持有,再使用,使用完,取消持有(不能釋放)release/autorelease

3、對於區域性的autorelease變數,可以不持有,不釋放,僅使用

現在來看看第一句話

怎樣才算自己建立的物件?

只要是呼叫以下的方法

alloc

newcopy

mutablecopy

所生成的物件,都被稱為「自己建立的物件」

例如:1、id obj = [[nsobject alloc]init];

2、id obj = [nsobject new];

3、id otherobj = [nsmutablearray new];

id obj = [other copy]; 4、

id otherobj = [nsmutablearray new];

id obj = [other mutablecopy];

通過release/autorelease方法可以對自己建立的物件,進行釋放。

怎樣才算非自己建立的物件

只要不滿足上述的情況,通過函式返回的物件,或者通過函式引數傳來的物件,都可以算非自己建立的物件

比如:id obj =  [nsarray array];

或者  -(void)setobj:(id)obj ;

我們通常的使用方法

拿到物件先retain 

[obj retain];

然後使用,使用完畢

[obj release];   這裡不應該是釋放物件,應該是放棄持有,不管從思想上,還是從實際**的執行效果上

但是對於

obj是乙個通過autorelease返回的區域性變數,也可以不進行持有和取消持有

但是在非arc下,只要不是自己建立的物件,還是建議用第二種方式來處理,即先持有,在使用,最後取消持有

還有一種簡單的思考方式

alloc/new/copy/mutable的次數 + retain的次數  =   release次數+autorelease的次數

保證這樣的公式,才能你的程式沒有問題

3、release與autorelease

release是立即對物件的引用計數-1或者釋放物件

而autorelease會將物件註冊的autoreleasepool,當pool結束時,將對註冊到pool裡面的物件進行引用計數-1或者釋放物件

我們如何知道哪些物件註冊到了pool中呢?

自己寫的**自不必說,只要呼叫autorelease方法就會註冊到pool中

對於系統類庫的函式返回的物件,有這個規則

以new/alloc/copy/mutablecopy開頭的方法返回的物件,都是非autorelease物件,不會註冊到pool,你得到這個物件,就直接建立並持有

其他方法開頭的都是autorelease物件,這些物件都會註冊到pool中

看完《objective c 程式設計之道》有感

花了兩個小時看了一遍 objective c 程式設計之道 總結如下 1 我腦子抽筋了,門面模式和中介者模式差別這麼明顯我一開始能混淆了 2 單例模式很不一樣,跟語言機制有關,特別是記憶體分配的機制。而且oc需要單例時clone返回自己 3 裝飾模式oc多了一種方式用category 4 享元模式對...

高階程式設計之 socker程式設計

用來標記網路上的一台電腦 window ifconfiglinux ipconfig1 1 3 1.ipv4 被廣泛使用的 ip協議的版本號是4 當前再用,目前被廣泛應用 ipv4的位址位數為32位 4位位元組 位址有限,幾乎全部耗盡 1 1 3 2.ipv6 ip協議的版本號是6 ipv6的位址位...

高階程式設計之網路程式設計(三)

io 模型 1 阻塞模型 fifo pipe read fgetc fgets fread recv recvfrom 以上獲取資料的函式預設都是阻塞方式接收資料。2 非阻塞模型 2.1 在開始階段的open函式部分調整 open fifo o rdonly o nonblock 函式 open r...