課堂筆記:
- 只有OC對(duì)象才需要進(jìn)行內(nèi)存管理的本質(zhì)原因是OC對(duì)象存放在堆里面,非OC對(duì)象一般放在棧里面(棧內(nèi)存會(huì)被系統(tǒng)自動(dòng)回收)
- 當(dāng)使用alloc擎场、new或者copy創(chuàng)建一個(gè)對(duì)象時(shí)瞒御,對(duì)象的引用計(jì)數(shù)器默認(rèn)就是1
- 僵尸對(duì)象:已經(jīng)被銷毀的對(duì)象(不能再使用的對(duì)象)
- 野指針:指向僵尸對(duì)象(壞內(nèi)存)的指針父叙,給野指針發(fā)消息會(huì)報(bào)EXC_BAD_ACCESS錯(cuò)誤
- 空指針:沒有指向儲(chǔ)存空間的指針(里面存的是nil,也就是0)肴裙,給空指針發(fā)消息是沒有任何反應(yīng)的
- 為了避免野指針錯(cuò)誤的常見方法:在對(duì)象被銷毀之后趾唱,將指向?qū)ο蟮闹羔樧優(yōu)榭罩羔?/li>
- 一旦重寫dealloc方法,就必須調(diào)用[super dealloc]蜻懦,并且必須放在最后面調(diào)用
引用計(jì)數(shù)器的常見操作
- 給對(duì)象發(fā)送一條retain消息甜癞,可以使引用計(jì)數(shù)器值+1(retain方法返回對(duì)象本身)
- 給對(duì)象發(fā)送一條release消息,可以使引用計(jì)數(shù)器值-1
- 給對(duì)象發(fā)送retainCount消息宛乃,可以獲得當(dāng)前的引用計(jì)數(shù)器值
注意:release并不代表銷毀/回收對(duì)象悠咱,僅僅是引用計(jì)數(shù)器-1
-
要想手動(dòng)調(diào)用retain、release等方法征炼,就必須關(guān)閉ARC功能 在build Setting下搜索automatic r就可以
手動(dòng)管理內(nèi)存 -
默認(rèn)情況下析既,Xcode是不會(huì)管僵尸對(duì)象的,使用一塊被釋放的內(nèi)存也不會(huì)報(bào)錯(cuò)谆奥,為了方便調(diào)試眼坏,應(yīng)該開啟僵尸對(duì)象監(jiān)控
僵尸對(duì)象監(jiān)控
@property參數(shù)
- 控制set方法的內(nèi)存管理
1.retain:release舊值,retain新值(OC對(duì)象)
2.assign:直接賦值酸些,不做任何內(nèi)存處理(默認(rèn)宰译,用于非OC對(duì)象類型)
3.copy:release舊值,copy新值(一般用于NSString *) - 控制需不需生成set方法
1.readwrite:同時(shí)生成set方法和get方法(默認(rèn))
2.readonly:只會(huì)生成get方法 - 多線程管理
1.atomic:性能低(默認(rèn))
2.nonatomic:性能高
set方法的內(nèi)存管理
-(void)setCar:(NSString *)car
{
if (car != _car) {
//對(duì)當(dāng)前正在使用的車(舊車)做一次release
[_car release];
//對(duì)新車做一次retain操作
_car = [car retain];
}
}```
***
@class和#import的區(qū)別
- 作用上的區(qū)別:#import會(huì)包含引用類的所有信息(內(nèi)容)魄懂,包括引用類的變量和方法沿侈。@class僅僅是告訴編譯器有這么一個(gè)類,具體這個(gè)類里面有什么信息市栗,完全不知
- 效率上的區(qū)別:如果有上百個(gè)頭文件都#import了用一個(gè)文件肋坚,或者這些文件依次被#import,那么一旦最開始的頭文件稍有改動(dòng),后面引用到這個(gè)文件的所有類都需要重新編譯一遍智厌,編譯效率非常低诲泌。相對(duì)來說,使用@class方式就不會(huì)出現(xiàn)這個(gè)問題了