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...