iOS 空指針 野指針 僵尸對象

?一些基礎(chǔ)的知識,經(jīng)常混淆,特整理下

空指針:

1. 沒有存儲任何內(nèi)存地址的指針就稱為空指針(NULL指針)。

2.被賦值為nil的指針,在沒有被具體初始化之前,為nil。

注意:?

nil和Null區(qū)別不是初始化前后的區(qū)別,是nil代表對象類型的空指針,Null代表基本數(shù)據(jù)類型的空指針。

3.nil、Nil、NULL、NSNULL的含義和區(qū)別

nil:OC中的對象的空指針

Nil:OC中類的空指針

NULL:C類型的空指針

NSNull:數(shù)值類的空對象

此處說一下NSNull,在集合中不能nil值,因?yàn)镹SArray和NSDictionary中nil有特殊的含義。但是有些時候,需要在集合中存放空值,比如個人信息中,只知道姓名,不知道電話號碼,此時,有必要將電話號碼設(shè)置為空,這時,就用到了NSNull。

NSNull中只有一個null方法 :[NSNull null]

[dic setObject:[NSNull null] forKey:@"phoneNumber"];

if(phoneNumber == [NSNull null]){

//...

}

野指針:

1."野指針"不是nil指針,是指向"垃圾"內(nèi)存(不可用內(nèi)存)的指針。野指針是非常危險的。

示例:

Student *stu = [[Student alloc] init];

[stu setAge:10];

[stu release];這里已經(jīng)釋放內(nèi)存

[stu setAge:10];---》報錯

如果改動一下代碼,就不會報錯

Student *stu = [[Student alloc] init];

[stu setAge:10];

[stu release];

stu = nil;?

[stu setAge:10]; //消息是無法發(fā)送出去的,不會造成任何的影響,當(dāng)然也不會報錯。


補(bǔ)充說明:

1.Student對象接收到release消息后,會馬上被銷毀,所占用的內(nèi)存會被回收。” 這里執(zhí)行release只是標(biāo)記對象占用的那塊內(nèi)存可以被釋放,但是具體的釋放的時間是不可控的,如果在release之后執(zhí)行[stu setAge:10];不一定會野指針crash,如果對象內(nèi)存已經(jīng)被其他對象覆寫占用,那么會crash,如果沒有沒覆寫,調(diào)用依然可以正確執(zhí)行。

2.向空指針發(fā)送消息不會報錯,但是給野指針發(fā)送消息會報錯

僵尸對象

遇到exc_bad_access這類問題一般都是僵尸對象引起的,可以開啟僵尸模式定位,我們并沒有保留他,只是在程序運(yùn)行到該對象的時候會產(chǎn)生問題,沒有誰會運(yùn)用他,只會定位他然后解決掉

內(nèi)存回收的本質(zhì).

1.申請一塊空間,實(shí)際上是向系統(tǒng)申請一塊別人不再使用的空間.

2.釋放一塊空間,指的是占用的空間不再使用,這個時候系統(tǒng)可以分配給別人去使用.

3.在這個個空間分配給別人之前 數(shù)據(jù)還是存在的.

? ? 3.1.OC對象釋放以后,表示OC對象占用的空間可以分配給別人.

? ? 3.2.但是再分配給別人之前 這個空間仍然存在 對象的數(shù)據(jù)仍然存在.

4.僵尸對象: 一個已經(jīng)被釋放的對象 就叫做僵尸對象.

使用野指針訪問僵尸對象.有的時候會出問題,有的時候不會出問題.

1.當(dāng)野指針指向的僵尸對象所占用的空間還沒有分配給別人的時候,這個時候其實(shí)是可以訪問的.

因?yàn)閷ο蟮臄?shù)據(jù)還在.

2.當(dāng)野指針指向的對象所占用的空間分配給了別人的時候 這個時候訪問就會出問題.

3.所以,你不要通過一個野指針去訪問一個僵尸對象.

? ? ? ?3.1.雖然可以通過野指針去訪問已經(jīng)被釋放的對象,但是我們不允許這么做.

僵尸對象檢測.

1.默認(rèn)情況下. Xcode不會去檢測指針指向的對象是否為一個僵尸對象. 能訪問就訪問 不能訪問就報錯.

2.可以開啟Xcode的僵尸對象檢測.

? ? ? ?2.1.那么就會在通過指針訪問對象的時候,檢測這個對象是否為一個僵尸對象 如果是僵尸對象 就會報錯.

為什么不默認(rèn)開啟僵尸對象檢測呢?

1.因?yàn)橐坏╅_啟,每次通過指針訪問對象的時候.都會去檢查指針指向的對象是否為僵尸對象.那么這樣的話 就影響效率了.

如何避免僵尸對象報錯.

1.當(dāng)一個指針變?yōu)橐爸羔樢院? 就把這個指針的值設(shè)置為nil

僵尸對象無法復(fù)活.

1.當(dāng)一個對象的引用計數(shù)器變?yōu)?以后 這個對象就被釋放了.

2.就無法取操作這個僵尸對象了. 所有對這個對象的操作都是無效的.

3.因?yàn)橐坏ο蟊换厥?對象就是1個僵尸對象 而訪問1個僵尸對象 是沒有意義.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容