People Lack Willpower,Rather Than Strength!
1.內(nèi)存管理:
- 影響:如果app占用內(nèi)存過大, 系統(tǒng)可能會強(qiáng)制關(guān)閉app, 造成閃退現(xiàn)象, 影響用戶體驗.
- 概念:所謂內(nèi)存管理, 就是對內(nèi)存進(jìn)行管理
- 分配內(nèi)存 : 比如創(chuàng)建一個對象, 會增加內(nèi)存占用
- 清除內(nèi)存 : 比如銷毀一個對象, 能減小內(nèi)存占用
思考:一旦一個空間沒有管理者,我們還可以對其采取操作嗎?
操作測試發(fā)現(xiàn),可以再去取值,但是不可以修改! 不知是否正確????? - 為什么要管理內(nèi)存:
- 堆與棧:
- 棧(操作系統(tǒng)):由操作系統(tǒng)自動分配釋放,存放函數(shù)的參數(shù)值,局部變量的值等。
- 堆(操作系統(tǒng)):一般由程序員分配釋放,若程序員不釋放,程序結(jié)束時可能由OS回收.
2.引用計數(shù)器:
- 說明:
- 每個OC對象都有自己的引用計數(shù)器
- 它是一個整數(shù),4個字節(jié)
- 從字面上, 可以理解為”對象被引用的次數(shù)”
- 也可以理解為: 它表示有多少人正在用這個對象
- Retain作用:
增加retainCount值
對象被回收的標(biāo)志:MRC--> retainCount = 0;
:ARC--> 沒有strong指針!本質(zhì)是:通過操作對象的引用計數(shù)器,管理對象占用的內(nèi)存.
3. dealloc
- 概念:對象即將被銷毀時系統(tǒng)會自動給對象發(fā)送一條dealloc消息.
- deallocc重寫:MRC機(jī)制下!
- 釋放相關(guān)資源,dealloc就是對象的遺言.
- 必須調(diào)用[super dealloc],并且放在最后面調(diào)用.
注意:dealloc是系統(tǒng)對對象發(fā)的消息,不是我們也不是編譯器.所以我們不要給對象發(fā)該消息!!
4.僵尸對象/野指針/空指針
- 僵尸對象:已經(jīng)被銷毀的對象.
- 野指針:指向不可用內(nèi)存(包括僵尸對象)的指針.
- 空指針:沒有指向存儲空間的指針(里面存的是nil, 也就是0)
- 給空指針發(fā)消息是沒有任何反應(yīng)的.
這時OC語言特性,如果是Java,就會報錯!
5.內(nèi)存管理原則----??前提是MRC情況下??
-
原則:
- 誰創(chuàng)建誰release: alloc/new/[mutable]copy-->release or autorelease
- 誰retain誰release
-
set方法內(nèi)存管理:
- 兩個思路:
思路1: -> 只要當(dāng)前對象不為nil 1. release之前的對象 2. retain需要使用的對象 if(_對象 != nil) { [_對象 release]; } _對象 = [參數(shù)對象 retain];
思路2: 1.retain需要使用的對象 2.release之前的對象 3.只有傳入的對象和之前的不同才需要release和retain if (參數(shù)對象 != _對象) { [_對象 release]; _對象 = [參數(shù)對象 retain]; }
6.@property管理內(nèi)存
- 控制set方法的內(nèi)存管理
- retain : release舊值,retain新值(用于OC對象)
- assign : 直接賦值,不做任何內(nèi)存管理(默認(rèn),用于非OC對象類型)
- copy : release舊值,copy新值(一般用于NSString *)
7.@class
- 作用:簡單的引用一個類,不包括具體信息.
- import會包含引用類的所有信息(內(nèi)容),包括引用類的變量和方法.
- 具體使用:
-
提高文件加載效率:
- 在.h文件中使用@class引用一個類
- 在.m文件中使用#import包含這個類的.h文件
-
避免循環(huán)導(dǎo)入:
- 對于循環(huán)依賴關(guān)系來說,比方:A類引用B類,同時B類也引用A類
- 這種嵌套包含的代碼編譯會報錯
-
8.循環(huán)retain
- 場景:A對象retain了B對象,B對象retain了A對象
- 弊端:致A對象和B對象永遠(yuǎn)無法釋放
- 解決方案:一端用retain、一端用assign
如果開啟ARC:一端用strong,一端用weak!