1. 引用計數器
用來保存當前對象有幾個東西正在使用它
2. 應用計數器的作用
用來判斷是否應該回收內存空間
3. 引用計數器的操作
retain +1 就是使用時對象時
release -1 誰創建誰釋放
retainCount 得到計數器的值 就是統計一共retain了幾次
4. 如果一個對象被釋放的時候,就會有‘臨終遺言’會調用delloc方法
因爲delloc是繼承NSObject所以在寫delloc的時候的是調用[super delloc]
就是在.m中寫delloc方法 如果對象被銷燬他就會執行
4,oc的內存管理分類
1, 因爲MRC是手動管理內存
ARC是自動管理內存
我們創建項目的時候默認是ARC的
需要把項目從ARC模式改成MAC
2,共分爲
系統自動管理
棧區
手動管理
堆區
他們都是系統自動管理
bss段
數據區
代碼區
5,關閉arc的方法
因爲xcode一般都是默認arc的方法的但是一些公司的老程序,以及蘋果的低從都是arc寫的
1,首先選中項目 然後將arc改爲no
6,內存管理怎麼判斷它是否被收回的依據呢?
從寫dealloc方法,,規範
1,一定是super dealloc ,而且一定是放到最後,就是釋放子類佔用父類的空間
2)永遠不要直接通過對象調用dealloc方法(實際上調用並不會出錯)一旦對象被回收了,它佔用的內存就不再可用,堅持使用會導致程序崩潰(野指針錯誤)爲了防止調用出錯,可以將“野指針”指向nil(0)。
7,內存管理的原則
1,只要還有人使用這個對象就不會被回收
你要想使用對象 ,就該引用計數器+1,
不想使用對象時 ,引用計數器-1。
2,誰創建 ,誰release,
如果通過alloc,new ,copy 創建對象必須調用release ,autorelasae的方法
3.誰創建誰release
只要對象調用retain,都必須調用release。
4,就是有始有終,有加就有減,
8,野指針(殭屍對象)
1,就是堆區的空間已經被釋放了,但是還有指針指針調用它
定義指針沒有被初始化
2,可以開啓殭屍對象的檢測模式........
也可以將對象= nil;
9,內存泄露
1,棧區對象已經被釋放堆區空間還沒有被釋放
幾個特徵:
1,retain 和release 個數不一樣
2,對象在使用過程中被賦值爲nil,如果等於nil就是指向一個特殊的地址無效地址
3,在函數或者方法中不當的使用retain或者relase造成的問題
4,多個對象泄露的問題
在.M文件中判斷傳遞的對象是否是原來的對象,如果不是的釋放,然後retain
(void)setCar:(Car*)car{
//判斷_car存放的是否是
形參對象,如果不是,則執行[_car realease];
if(_car!=car) {
[_carrelease];//先釋放上一個對象,(注意第一次是向nil發送release消息)_car= [car retain];
}
10,@property的參數
1,在xcode4.4之前我們要自己現實get,set方法。
4.4之後就不用了
2,修飾@property的關鍵字
三類:
原子性 : atomic 對屬性加鎖,多線程下安全,默認值
nonatomic 不加鎖, 不安全 速度快
讀寫性 : readwrite 生成 get set方法
readonly 只生成get方法
set 處理方法: assign 對用於基本數據類型
retain 用於對象
copy
11,@Class的使用
作用:
可以可以簡單的引用一個類,但是並不會包含類的所有內容
具體使用:
在.h文件中使用@class引用這個類
在.M文件中使用#import 包含這個類的。h文件
使用@class的好處
一旦最開始的頭文件稍有改動,後面引用到這個文件的所有類都需要重新編譯一遍,這樣的效率也是可想而知的
比如,循環依賴來說
用@class就不會報錯
在類中相互聲明
或
一個頭文件使用
#import
面試題#import和@class的區別。
作用上的區別
#import會包含引用類的所有信息(內容),包括引用類的變量和方法@class僅僅是告訴編譯器有這麼一個類,具體這個類裏有什麼信息,完全不知
效率上的區別
如果有上百個頭文件都#import了同一個文件,或者這些文件依次被#import,那麼一旦最開始的頭文件稍有改動,後面引用到這個文件的所有類都需要重新編譯一遍,編譯效率非常低相對來講,使用@class方式就不會出現這種問題了
12,循環retain問題
問題:就是2個對象誰都沒被誰釋放掉,這時候就需要以端“鬆手”
解決方: 當兩端互相引用時,應該一端用retain、一端用assign
13, NSSting類內存管理的問題
我也不懂
14,autorelease的使用
1,自動釋放池
1)在iOS程序運行過程中,會創建無數個池子,這些池子都是以棧結構(先進後出)存在的。
(2)當一個對象調用autorelease時,會將這個對象放到位於棧頂的釋放池中
2,自動釋放池的創建
autoreleasepool{
代表創建自動釋放池
}//代表自動釋放池銷燬
3,使用的好處
1,不用關心什麼時候釋放,什麼時候release
4,autorelease基本使用的語法
1,將對象放入自動釋放池中,池子會對對象自動release
5,autorelease使用注意
1,並不是放到自動釋放池中就會自動釋放
2.對象雖然在池外邊,但是把對象放到池裏 然後家加autorelease依然可以自動釋放
[對象 autorelease];
4,嵌套使用
總結一下:
-------------------------------知識點細節---------------------------
-1. 內存管理的範圍
* 所有的OC對象(繼承自NSObject類)
2. 爲什麼內存管理只管理OC對象?*堆中內存不連續,無法自動釋放
3. 我們如何對OC對象進行內存管理?*通過操作對象的"引用計數器"
4. 引用計數器
* 什麼是引用計數器?
1> 每個OC對象都有自己的引用計數器
1> 每個OC對象都有自己的引用計數器
2> 它是一個整數(int類型,佔用4個字節)
3> 從字面上,可以理解爲"對象被引用的次數"
4> 也可以理解爲:它表示有多少人正在用這個對象
* 引用計數器的作用?
1> 系統通過"引用計數器"來判斷當前對象是否可以被釋放
* 對象的"引用計數器"的操作方式1> retain, +1
2> release, -1
3> retainCount, 獲取對象引用計數器的值
5. 關閉ARC的方法
* 選中項目->選中Build
Settings ->選中All ->搜索
Automatic Reference Counting ->修改爲No
6. dealloc方法
* 當對象即將被銷燬,系統自動給對象發送一條dealloc消息
* 因此,從dealloc方法有沒有被調用,就可以判斷出對象是否被銷燬
* 重寫了dealloc方法,必須調用[super
dealloc],並且放在最後面調用*不要自己直接調用dealloc方法
7. 野指針\空指針\殭屍對象
* 殭屍對象:已經被銷燬的對象(不能再使用的對象)
* 野指針:指向殭屍對象(不可用內存)的指針
* 空指針:沒有指向存儲空間的指針(裏面存的是nil,也就是0)**注意:給空指針發消息是沒有任何反應的,不會