Objective-C高級編程:iOS與OSX多線程和內(nèi)存管理 讀后筆記(1)

這篇文章算是正正經(jīng)經(jīng)潛心下來開始重筑基礎(chǔ)储矩、探究底層的起點了,之前一直在找這樣或那樣的借口來逃避學(xué)習(xí)荠医,消遣生活吁脱,如今也著實被各種面試消遣了一個月桑涎,感慨良多〖婀保總而言之還是希望能通過一些文字攻冷,幫助自己和看這篇文章的朋友,理解知識遍希,從而記住知識等曼,到最后形成知識體系,“牽一發(fā)孵班,思全身”涉兽。也借此幫助自己整理思路,搭建屬于自己的知識體系篙程。

第1章 自動引用計數(shù)

1.1 什么是自動引用計數(shù)
  • 自動引用計數(shù)(ARC - Automatic Reference Counting)是指在內(nèi)存管理中 對引用 采用自動計數(shù)的技術(shù)枷畏。
  • 時間軸:2012年 - iOS 5 - Xcode 4.2
    https://developer.apple.com/download/more/
    image.png
1.2 內(nèi)存管理/引用計數(shù)
1.2.1 概述
  • 辦公室開關(guān)燈的例子可以很好的描述引用計數(shù)對于內(nèi)存的管理。
  • 白天上班人多肯定多開燈虱饿,晚上一兩個人加班也就開一兩盞燈拥诡,下班了關(guān)燈鎖門。
1.2.2 內(nèi)存管理的思考方式
  • 誰生成誰持有氮发,誰引用誰釋放渴肉,沒引用就別想插手別人的人生了(非自己持有的對象無法釋放)。
  • 對象操作與Objective - C方法的對應(yīng)
    image.png
  • Cocoa框架中Foundation框架類庫的NSObject類擔(dān)負(fù)內(nèi)存管理的職責(zé)爽冕。alloc/retain/release/dealloc方法也都指代的是NSObject中對應(yīng)的實例方法仇祭。
1.2.2.1 生成/持有/銷毀

這一節(jié)嘗試代碼操作,首先要介紹兩個點颈畸,一個是ARC和MRC的切換乌奇,還有一個是ARC機制下如何觀察對象的引用計數(shù)(retainCount)。

  • ARC和MRC切換方法一:單一文件切換
    選擇項目中的Target-> Build Phases-> Complie Sources中選擇需要ARC/MRC的文件雙擊眯娱, ARC在輸入框中輸入:-fobjc-arc礁苗,如果不要ARC則輸入:-fno-objc-arc


    image.png
  • ARC和MRC切換方法二:切換MRC環(huán)境
    選擇項目中的Target -> Build Sttings -> All -> 搜索‘a(chǎn)utomatic’ -> 把 Objective-C Automatic Reference Counting 設(shè)置為 NO


    image.png
  • ARC機制下如何觀察對象的引用計數(shù)(retainCount)
    printf("retain count = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));'
    這里實際上就是將OC對象轉(zhuǎn)換為CF對象并查看其引用計數(shù),注意這里用的是__bridge徙缴,而不是__bridge_retain试伙。

關(guān)于對象與指針

  • 正文開始前還需要說點基礎(chǔ)性的東西,這關(guān)系到后面生成/持有的理解問題于样。
  • 我們來看這行代碼:
    UIView * view = [[UIView alloc] init];
    代碼很簡單疏叨,實例化了一個UIView對象,那么誰是對象穿剖?如果你認(rèn)為imgView是對象那就錯了蚤蔓,view是指針,指針指向的是對象携御。
  • 這行代碼實際上產(chǎn)生的是兩個東西:UIView變量 和 UIView對象昌粤,UIView對象存儲于內(nèi)存,UIView變量指向內(nèi)存中的對象啄刹。
  • 本質(zhì)上來說涮坐,類是一種指針類型的變量,程序中定義的UIImageView* 類型只是存放一個地址值誓军,保存在main()函數(shù)的動態(tài)存儲區(qū)袱讹,它指向?qū)嶋H的UIView對象,而真正的UIView對象則存放堆(heap)內(nèi)存中昵时。
  • 所有對象都只能通過指針變量來訪問捷雕,堆內(nèi)存中也可以有多個指針,也就是允許多個指針指向同一個對象壹甥,例如:
    UIImageView * imgView_other = [[UIImageView alloc] init];
  • 如果堆內(nèi)存中的對象沒有任何變量指向該對象救巷,那么程序就無法訪問該對象句柠,就要釋放內(nèi)存浦译,否則就造成內(nèi)存泄漏。

自己生成的對象溯职,自己所持有

  • 使用alloc/new/copy/mutableCopy名稱開頭的方法名意味著自己生成的對象只有自己持有精盅。
  • 我們來敲代碼試試看:
    id obj = [[NSObject alloc] init];
    printf("retainCount = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
    輸出結(jié)果:retainCount = 1
  • 使用NSObject類的alloc類方法就能自己生成并持有對象。指向生成并持有對象的指針被賦值給obj谜酒。實際上這就是我上面為什么要談到的對象與指針的概念叹俏,obj是個指針。別著急僻族,下面還有問題粘驰。
  • copy方法和mutableCopy方法這里就不多贅述了,都是生成并持有對象的副本鹰贵,區(qū)別在于對象的可變和不可變晴氨。

非自己生成的對象,自己也能持有

  • 用alloc/new/copy/mutableCopy以外的方法獲得對象碉输,因為不是自己生成并持有籽前,所以自己不是對象的持有者。
  • 同樣敷钾,敲代碼看看:
    id obj = [NSMutableArray array];
    printf("retainCount = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
    輸出結(jié)果:retainCount = 1
  • 源代碼中枝哄,NSMutableArray類對象被賦給obj,但變量obj自己并不持有該對象阻荒。使用retain方法可以持有對象挠锥。好的,那么問題來了侨赡,為什么obj并沒有持有對象蓖租,打印obj的retainCount粱侣,結(jié)果依然是1?
    這就是上文提及對象與指針的意義蓖宦,obj其本身是個指針齐婴,指向內(nèi)存中的對象,這里打印的retainCount其實質(zhì)是對象的retainCount稠茂,賦值給obj的是未持有對象的指針柠偶。如果想要obj持有對象,就需要:
    [obj retain];
    printf("retainCount = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
    輸出結(jié)果:retainCount = 2
    所以這里一定要搞明白睬关,其實這里還可以再探究下array這個類方法诱担,回頭有時間再填這個坑吧。

在不需要的時候电爹,將自己持有的對象釋放

  • 這塊原題是“不再需要自己持有的對象時釋放”蔫仙,讀起來理解起來實在拗口,改一下丐箩。自己持有的對象匀哄,一旦不再需要,持有者有義務(wù)釋放該對象雏蛮,使用release方法涎嚼。
  • 同樣,敲代碼:
    id obj = [NSMutableArray array];
    [obj retain];
    printf("retainCount = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
    [obj release];
    printf("retainCount = %ld\n",CFGetRetainCount((__bridge CFTypeRef)(obj)));
    輸出結(jié)果:
    retainCount = 2
    retainCount = 1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末挑秉,一起剝皮案震驚了整個濱河市法梯,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌犀概,老刑警劉巖立哑,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異姻灶,居然都是意外死亡铛绰,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門产喉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捂掰,“玉大人,你說我怎么就攤上這事曾沈≌庀” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵塞俱,是天一觀的道長姐帚。 經(jīng)常有香客問我,道長障涯,這世上最難降的妖魔是什么罐旗? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任膳汪,我火速辦了婚禮,結(jié)果婚禮上九秀,老公的妹妹穿的比我還像新娘旅敷。我一直安慰自己,他們只是感情好颤霎,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著涂滴,像睡著了一般友酱。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上柔纵,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天缔杉,我揣著相機與錄音,去河邊找鬼搁料。 笑死或详,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的郭计。 我是一名探鬼主播霸琴,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼昭伸!你這毒婦竟也來了梧乘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤庐杨,失蹤者是張志新(化名)和其女友劉穎选调,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體灵份,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了纹磺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谎倔。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖氛什,靈堂內(nèi)的尸體忽然破棺而出横浑,到底是詐尸還是另有隱情,我是刑警寧澤屉更,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布徙融,位于F島的核電站,受9級特大地震影響瑰谜,放射性物質(zhì)發(fā)生泄漏欺冀。R本人自食惡果不足惜树绩,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望隐轩。 院中可真熱鬧饺饭,春花似錦、人聲如沸职车。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽悴灵。三九已至扛芽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間积瞒,已是汗流浹背川尖。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留茫孔,地道東北人叮喳。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像缰贝,于是被迫代替她去往敵國和親馍悟。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

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