1.棧葬毫、堆
棧
1.棧內(nèi)存是由系統(tǒng)管理的
2.棧是用來存放局部變量
3.當(dāng)代碼執(zhí)行到定義哪一行為這個局部變量分配存儲空間
4.當(dāng)程序執(zhí)行到定義變量的代碼塊結(jié)束的時候诸尽,就會回收這個變量
堆:
1撞秋,堆內(nèi)存是由程序員管理(動態(tài)存儲區(qū))
2. OC中的對象時在堆內(nèi)存中
2.引用計數(shù)器:
OC中每一個對象,都有4個字節(jié)存儲空間,用來存放引用計數(shù)的值
作用:
引用計數(shù)器的值徘熔,就是當(dāng)前有多少個人在使用對象
當(dāng)引用計數(shù)器為0時候车猬,系統(tǒng)會立即回收這個對象
在OC中判斷一個對象是否被回收的唯一依據(jù):就是看這個對象的引用計數(shù)器是否為0
如何操作引用計數(shù)器:
1.當(dāng)新創(chuàng)建一個對象的時候霉猛,他引用計數(shù)器為1(new,alloc,copy,multableCopy)
2.當(dāng)給一個對象發(fā)送retain消息,它的引用計數(shù)器+1
3.當(dāng)給一個對象發(fā)送release消息珠闰,它的引用計算器-1
當(dāng)一個對象的引用計數(shù)器為0時候惜浅,系統(tǒng)就會調(diào)用dealloc
作用:1.驗(yàn)證對象是否被回收了
2.釋放對象自己的資源
當(dāng)一個對象的引用計數(shù)器為0的時候,這個對象就是僵尸對象
3.野指針:
當(dāng)一個對象指針指向一個僵尸對象的時候伏嗜,那么這個指針就是野指針
當(dāng)定義一個指針坛悉,而這個指針沒有進(jìn)行初始化
操作野指針是非常危險的:1.程序崩潰了 2.數(shù)據(jù)錯誤
4.內(nèi)存管理是來管理“OC對象”的內(nèi)存的
內(nèi)存管理不當(dāng)造成兩個問題:
一個對象不再使用了,但是依然占據(jù)內(nèi)存承绸,內(nèi)存泄露
一個對象正在被使用裸影,但卻已經(jīng)釋放了,野指針八酒。
5.空指針:
nil:OC實(shí)例對象的指針指向nil時空民,這個指針就是一個空指針
1.給空指針發(fā)送消息不會報錯 2刃唐、它不會去調(diào)用方法
當(dāng)一個指針已經(jīng)被release了那么還要對該指針做一個清空的操作(person = nil)
防止后面使用到該指針的時候?qū)е鲁绦虮罎?/p>
6.nil 羞迷,Nil ,NULL,NSNull的區(qū)別
nil ?:OC對象的空指針
Nil ?:OC類對象的空指針
NULL :C語言的空指針
NSNull:是一個單例對象,用來在OC的集合中占的位置
7.內(nèi)存管理的原則:
1画饥、當(dāng)有人使用這個對象就不要釋放這個對象
2衔瓮、當(dāng)沒有人使用這個對象就釋放該對象
8.OC手動內(nèi)存管理的黃金法則:
凡是調(diào)用alloc,new,copy,multableCopy創(chuàng)建一個新對象或調(diào)用retain
讓對象的引用計數(shù)+1抖甘,都必須相應(yīng)的調(diào)用一次release或者autorelease
9.@property參數(shù)
管理內(nèi)存
retain 生產(chǎn)內(nèi)存管理的代碼
assign 沒有內(nèi)存管理的代碼(默認(rèn))
當(dāng)使用OC對象時候热鞍,就用retain
當(dāng)使用非OC對象(基本數(shù)據(jù)類型,枚舉衔彻,結(jié)構(gòu)體)時候薇宠,就用assign
當(dāng)使用NSString,Block對象時候艰额,就用copy
控制線程安全
nonatomic : 非線程安全的澄港,不加鎖,速度快(iOS基本都是用這個)
atomic:線程安全的柄沮,加鎖回梧,速度慢(默認(rèn)的)
控制訪問權(quán)限
readonly 表示只讀,只生成getter方法祖搓,不生產(chǎn)setter方法
readwrite 表示可讀寫的狱意,既生成getter又生產(chǎn)setter方法
修改getter和setter方法名稱
getter=getter方法的名稱
setter=setter方法的名稱:
一般當(dāng)一個成員變量是BOOL類型時候,需要修改getter方法名稱拯欧,為is+屬性名稱首字母大寫
10.@class 使用格式
@lass 類名;
作用:告訴編譯器详囤,@class后面是一個類,但是類中有什么樣屬性镐作,什么方法都不知道
@class 主要功能就是用來解決循環(huán)導(dǎo)入問題
在頭文件中使用@class說明這個類
如果在實(shí)現(xiàn)文件中有用到這個類的方法或?qū)傩圆亟悖捅仨氃趯?shí)現(xiàn)文件(.m文件)導(dǎo)入這個類
11.循環(huán)retain蚓再,導(dǎo)致在環(huán)中的所有對象對象都不能釋放,(內(nèi)存泄露)
解決方法:
只要環(huán)中有一條線用retain的包各,另一條線是assign
注意:用assign的一端在重寫dealloc方法時不需要給對方的對象做release釋放操作
12.autorelease 基本使用
作用:延遲對象的釋放時間
原理:
當(dāng)一個對象調(diào)用autorelease時候摘仅,就會把這個對象放到自動釋放池中,這時候?qū)ο髴?yīng)用計數(shù)器沒有發(fā)生改變
當(dāng)自動釋放池銷毀的時候问畅,會對池中所有對象進(jìn)行一次release操作
當(dāng)你給一個對象發(fā)送多少次autorelease消息娃属,那么當(dāng)自動釋放池銷毀時候,就會相應(yīng)的調(diào)用多少次release