BOOL/bool/Boolean/NSCFBoolean

Objective-C用BOOL來(lái)編碼真值,它是signed char的typedef,并且用宏YES和NO來(lái)表示真和假础芍。

布爾值用于條件判斷,比如if和while語(yǔ)句数尿,來(lái)進(jìn)行有條件的邏輯或者重復(fù)運(yùn)行。當(dāng)判斷一個(gè)條件語(yǔ)句惶楼,數(shù)值0為“假”右蹦,而其他任何數(shù)值為“真”。因?yàn)镹ULL和nil被定義為0歼捐,所以對(duì)于折現(xiàn)不存在的數(shù)值的條件語(yǔ)句也被判定為“假”何陆。

在Objective-C中,當(dāng)遇到處理真值的參數(shù)豹储、屬性和實(shí)例變量時(shí)贷盲,使用類(lèi)型BOOL。當(dāng)分配字面值時(shí)剥扣,使用宏YES和NO巩剖。

錯(cuò)誤問(wèn)題的錯(cuò)誤答案

新手經(jīng)常在條件判斷時(shí)加入等號(hào)運(yùn)算符:

if ([a isEqual:b] == YES) {
    ...
}

這不僅僅是不必要的,而且根據(jù)左邊的值钠怯,它有可能會(huì)導(dǎo)致不可預(yù)料的結(jié)果佳魔。正如Big Nerd Ranch blog post, "BOOL's Sharp Edges"中所描述的那樣:

static BOOL different (int a, int b) { 
    return a - b;
}

然而,因?yàn)锽OOL在實(shí)際中被typedef為signed char晦炊,所以結(jié)果并不會(huì)像預(yù)期的那樣:

if (different(11, 10) == YES) { 
    printf ("11 != 10\n");
} else { 
    printf ("11 == 10\n");
}
if (different(10, 11) == YES) { 
    printf ("10 != 11\n");
} else { 
    printf ("10 == 11\n");
}
if (different(512, 256) == YES) {
    printf ("512 != 256\n");
} else { 
    printf ("512 == 256\n");
}

此結(jié)果為:
11 != 10 10 == 11 512 == 256

它可能符合語(yǔ)法鞠鲜,但是它在語(yǔ)意上完全說(shuō)不通宁脊。所以,取而代之的方法是贤姆,使用==輸出結(jié)果榆苞,或者將數(shù)值通過(guò)!(或者!!)轉(zhuǎn)換成布爾值。

關(guān)于NSNumber和BOOL的真相

下面的表達(dá)式會(huì)輸出什么霞捡?

NSLog(@"%@", [@(YES) class]);

答案是:
__NSCFBoolean

NSCFBoolean是NSNumber類(lèi)簇中的一個(gè)私有的類(lèi)坐漏。它是通往CFBooleanRef類(lèi)型的橋梁,它被用來(lái)給Core Foundation的屬性列表和集合封裝布爾數(shù)值弄砍。CFBoolean定義了常量kCFBooleanTrue和kCFBooleanFalse仙畦。因?yàn)镃FNumberRef和CFBooleanRef在Core Foundation中屬于不同種類(lèi),這樣是有道理的音婶,它們?cè)贜SNumber被以不同的銜接類(lèi)呈現(xiàn)慨畸。

下面的表格是Objective-C中的所有真值類(lèi)型和數(shù)值:

Name Typedef Header True Value False Value
BOOL signed char objc.h YES NO
bool _Bool(int) stdbool.h true false
Boolean unsigned char MacTypes.h TRUE FALSE
NSNumber __NSCFBoolean Foundation.h @(YES) @(NO)
CFBooleanRef struct CoreFoundation.h kCFBooleanTrue kCFBooleanFalse
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市衣式,隨后出現(xiàn)的幾起案子寸士,更是在濱河造成了極大的恐慌,老刑警劉巖碴卧,帶你破解...
    沈念sama閱讀 222,378評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件弱卡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡住册,警方通過(guò)查閱死者的電腦和手機(jī)婶博,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,970評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)荧飞,“玉大人凡人,你說(shuō)我怎么就攤上這事√纠” “怎么了挠轴?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,983評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)耳幢。 經(jīng)常有香客問(wèn)我岸晦,道長(zhǎng),這世上最難降的妖魔是什么睛藻? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,938評(píng)論 1 299
  • 正文 為了忘掉前任启上,我火速辦了婚禮,結(jié)果婚禮上店印,老公的妹妹穿的比我還像新娘碧绞。我一直安慰自己,他們只是感情好吱窝,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,955評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布讥邻。 她就那樣靜靜地躺著迫靖,像睡著了一般。 火紅的嫁衣襯著肌膚如雪兴使。 梳的紋絲不亂的頭發(fā)上系宜,一...
    開(kāi)封第一講書(shū)人閱讀 52,549評(píng)論 1 312
  • 那天,我揣著相機(jī)與錄音发魄,去河邊找鬼盹牧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛励幼,可吹牛的內(nèi)容都是我干的汰寓。 我是一名探鬼主播,決...
    沈念sama閱讀 41,063評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼苹粟,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼有滑!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起嵌削,我...
    開(kāi)封第一講書(shū)人閱讀 39,991評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤毛好,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后苛秕,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體肌访,經(jīng)...
    沈念sama閱讀 46,522評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,604評(píng)論 3 342
  • 正文 我和宋清朗相戀三年艇劫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了吼驶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,742評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡店煞,死狀恐怖旨剥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情浅缸,我是刑警寧澤,帶...
    沈念sama閱讀 36,413評(píng)論 5 351
  • 正文 年R本政府宣布魄咕,位于F島的核電站衩椒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏哮兰。R本人自食惡果不足惜毛萌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,094評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望喝滞。 院中可真熱鬧阁将,春花似錦、人聲如沸右遭。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,572評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吹榴,卻和暖如春亭敢,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背图筹。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,671評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工帅刀, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人远剩。 一個(gè)月前我還...
    沈念sama閱讀 49,159評(píng)論 3 378
  • 正文 我出身青樓扣溺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親瓜晤。 傳聞我的和親對(duì)象是個(gè)殘疾皇子锥余,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,747評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容