值類型與引用類型,可變與不可變

類型本質(zhì)

變量:一個(gè)內(nèi)存地址的別名
例如 int a = 0;
a : 0x0004拄轻,int 32位婚度,那么 a 的范圍是 [0x0004, 0x0006)

a
0x4               0x5               0x6
00000000 00000000 00000000 00000000 00000000

值類型:變量對(duì)應(yīng)的內(nèi)存地址的內(nèi)容當(dāng)做數(shù)值。
例如 int a = 0; a 的范圍取出來进宝,按照int的方式轉(zhuǎn)出來刻坊,當(dāng)做值,&a 可以取到 a 的地址党晋。

引用類型:變量對(duì)應(yīng)的內(nèi)存地址的內(nèi)容當(dāng)做內(nèi)存地址谭胚,再去取改地址的內(nèi)容徐块。
例如 int *b; b 的內(nèi)容是個(gè)地址,通過 *b 取得該地址內(nèi)容灾而。

如果定義了三級(jí)指針 int ***b; 那么需要 &&&b 取得內(nèi)容胡控。

  • 需要注意的點(diǎn)

int a = 10;
int *b = &a;
int *c = &a;
b, c 兩個(gè)指針指向同一個(gè)地址的數(shù)據(jù),那么很可能 b 的數(shù)據(jù)被 c 改掉旁趟。

如果你允許多個(gè)指針改同一份數(shù)據(jù)昼激,那可以這樣用。例如

void fun() {
    Person *me = new Person();
    editName(me);
    editAge(me);
    editSex(me);
    // me 里就收集到了全部數(shù)據(jù)
}

如果不希望多個(gè)指針改同一份數(shù)據(jù)锡搜,造成數(shù)據(jù)錯(cuò)誤橙困,那么應(yīng)該copy一份。例如

int a = 10;
int *b = malloc(sizeof(int));
*b = a;
int *c = malloc(sizeof(int));
*c = a;
// 那么修改 b 不會(huì)影響到 c

如果是 Person 這樣的類耕餐,例如

Class Person {
    int a;
    int *b;
    Hand *h;    // h 里面還有指針變量
};

Person p, p1, p2;
p1 = p.copy;
p2 = p.copy;
在淺拷貝的時(shí)候凡傅,只復(fù)制 Person,a 會(huì)被復(fù)制肠缔,p1.a 和 p2.a 修改不影響夏跷,但是 p1.b 和 p2.b 還是指向同一塊數(shù)據(jù),還是有可能被錯(cuò)誤修改明未。

需要深拷貝槽华,對(duì) p 中的指針也進(jìn)行拷貝,對(duì)指針中的指針亚隅,一直下去硼莽,直到它不是個(gè)指針為止的數(shù)據(jù)都要進(jìn)行拷貝,才是完全的兩個(gè) p1, p2煮纵。

可變與不可變

有些指針的數(shù)據(jù)是可變的懂鸵,有些指針的數(shù)據(jù)是肯定不會(huì)變化的(那么在copy的時(shí)候可以只copy指針而不copy內(nèi)容),為了區(qū)分?jǐn)?shù)據(jù)可不可變行疏,那么定義了可變與不可變的類型匆光。

C++ 中用 const 區(qū)分

int const *p = &a;    // 內(nèi)容不可變
int * const p = &a;   // 指針不可變
int const * const p = &a;    // 指針,內(nèi)容都不可變

oc 中用 Mutable 區(qū)分酿联, swift 中 var 與 let

NSString *s1 = @"abcd";   // 內(nèi)容不可變终息,但指針可變,p 可以指其他
NSMutableString *s2 = [[NSMutableString alloc] init];   // 指針贞让,內(nèi)容都可變

oc中少了指針不可變周崭。

oc中第二個(gè)風(fēng)險(xiǎn)
@interface NSMutableString : NSString
NSMutableString 是繼承 NSString 的,可變和不可變通過繼承來實(shí)現(xiàn)喳张。
基類指針可以指向子類续镇,那么 NSString *s1 可以指向 NSMutableString,那 NSString 不可變的意義就沒了销部。

實(shí)際中 NSString 可能是可以變的摸航,當(dāng)他指向 NSMutableString 的時(shí)候制跟。

怎么避免,類型要對(duì)上

// 傳入時(shí)
NSMutableString *s2 = [[NSMutableString alloc] init];
for (int i=0; i<10; i++) {
    [s2 appendString:@"xxx"];
    [self dealString:[s2 copy]];  // 防止改變string
}

- (void)dealString:(NSString *)str {
     NSString *a = [str copy];    // 防止別人傳 NSMutableString 進(jìn)來
}
// 傳出時(shí)
- (NSArray *)personArray {
     NSMutableArray *array = [[NSMutableArray alloc] init];
     [array addObject:p1];
     [array addObject:p2];
     ...
    return [array copy];    // 按照類型傳出
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末酱虎,一起剝皮案震驚了整個(gè)濱河市雨膨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌读串,老刑警劉巖聊记,帶你破解...
    沈念sama閱讀 219,188評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異爹土,居然都是意外死亡甥雕,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門胀茵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人挟阻,你說我怎么就攤上這事琼娘。” “怎么了附鸽?”我有些...
    開封第一講書人閱讀 165,562評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵脱拼,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我坷备,道長(zhǎng)熄浓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評(píng)論 1 295
  • 正文 為了忘掉前任省撑,我火速辦了婚禮赌蔑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘竟秫。我一直安慰自己娃惯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評(píng)論 6 392
  • 文/花漫 我一把揭開白布肥败。 她就那樣靜靜地躺著趾浅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪馒稍。 梳的紋絲不亂的頭發(fā)上皿哨,一...
    開封第一講書人閱讀 51,708評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音纽谒,去河邊找鬼证膨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛佛舱,可吹牛的內(nèi)容都是我干的椎例。 我是一名探鬼主播挨决,決...
    沈念sama閱讀 40,430評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼订歪!你這毒婦竟也來了脖祈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,342評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤刷晋,失蹤者是張志新(化名)和其女友劉穎盖高,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體眼虱,經(jīng)...
    沈念sama閱讀 45,801評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡喻奥,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了捏悬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片撞蚕。...
    茶點(diǎn)故事閱讀 40,115評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖过牙,靈堂內(nèi)的尸體忽然破棺而出甥厦,到底是詐尸還是另有隱情,我是刑警寧澤寇钉,帶...
    沈念sama閱讀 35,804評(píng)論 5 346
  • 正文 年R本政府宣布刀疙,位于F島的核電站,受9級(jí)特大地震影響扫倡,放射性物質(zhì)發(fā)生泄漏谦秧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評(píng)論 3 331
  • 文/蒙蒙 一撵溃、第九天 我趴在偏房一處隱蔽的房頂上張望疚鲤。 院中可真熱鬧,春花似錦征懈、人聲如沸石咬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鬼悠。三九已至,卻和暖如春亏娜,著一層夾襖步出監(jiān)牢的瞬間焕窝,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評(píng)論 1 272
  • 我被黑心中介騙來泰國打工维贺, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留它掂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像虐秋,于是被迫代替她去往敵國和親榕茧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評(píng)論 2 355

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

  • 多線程客给、特別是NSOperation 和 GCD 的內(nèi)部原理用押。運(yùn)行時(shí)機(jī)制的原理和運(yùn)用場(chǎng)景。SDWebImage的原...
    LZM輪回閱讀 2,007評(píng)論 0 12
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 1,984評(píng)論 0 7
  • 史上最全的iOS面試題及答案 iOS面試小貼士———————————————回答好下面的足夠了----------...
    Style_偉閱讀 2,356評(píng)論 0 35
  • 早晨靶剑,陽光中下著暴雨 注定開始了我痛苦的一天 拿著一本的成績(jī) 被一所不好的大學(xué)(學(xué)院調(diào)擋) 我無奈 放棄蜻拨,我的心里...
    寒嘯同學(xué)在努力閱讀 312評(píng)論 0 1
  • 智能手機(jī)的普及坑匠,讓越來越多的人成為低頭族血崭,不管是上班的還是上學(xué)的,凡是有手機(jī)的笛辟,百分之九十九都在低頭玩手機(jī)功氨。手機(jī)...
    滿分達(dá)人閱讀 1,178評(píng)論 0 3