學(xué)習(xí)Objective-C (一)初窺

objective-c

學(xué)習(xí)ios首先就是要學(xué)習(xí)object-c(以下簡稱OC),雖然現(xiàn)在有了更方便的Swift凫佛,但是萬變不離其宗嘛~讲坎,就像我們有了更高級的C++、Java等面向?qū)ο笳Z言的時候愧薛,我們還是喜歡去研究一下他們的實現(xiàn)原理晨炕,就是為了更好滴把控他。要知道毫炉,只有隨心所欲滴掌控一樣?xùn)|西瓮栗,才可以真正做到為我所用,任我所用瞄勾!此乃為內(nèi)功也费奸!

我剛開始學(xué)習(xí),花了一個星期時間看了這本Objective-C 編程,每天晚上花個兩個小時左右時間进陡,國外原版太貴也不好搞愿阐,只好用翻譯的了。 由于之前學(xué)習(xí)過C語言趾疚,所以前面兩部分工12章幾乎一帶而過缨历。這本書寫的的確不錯,難易有當(dāng)糙麦,適合所有初學(xué)者看辛孵,而且要在實際開發(fā)中不斷滴看。當(dāng)時看完這本書赡磅,還給幾個小伙伴做了簡單的分享觉吭,寫了個很粗糙的PPT

我覺得大部分內(nèi)容都是比較簡單的,有C語言基礎(chǔ)的人仆邓,看起來應(yīng)該好不費事鲜滩。不過我是一個foolish boy嘛,所以還是有一些不懂的地方节值。在此把我不太懂的地方徙硅,也可能是大家比較關(guān)注的幾個問題列出來,并結(jié)合網(wǎng)上資料和自己的理解給個參考答案搞疗,歡迎大家指正嗓蘑。


  1. #include / #import / #@import
    OC里面包含頭文件的方式有了import這種方式须肆,那么它到底什么來頭?
    我們知道在C桩皿、C++等其他編程語言中豌汇,為了防止某一個頭文件被多次包含,我們會使用#ifndef #define的方式泄隔,在OC中import就自動解決這種問題了拒贱,所以推薦用import(實際上幾乎所有的ios程序都使用import)。有了#import佛嬉,怎么還有一個@import呢逻澳?這又是神馬東東。 這就要提到一個新的特性暖呕,叫做Modules斜做,最基本的作用就是為了加速編譯階段。 #import只是簡單地做代碼替換湾揽,這將無疑增加程序的大小和編譯時間瓤逼,例如一個UIKit框架的代碼就有11000行。@import會在編譯的預(yù)處理階段預(yù)先計算和緩存需要的代碼库物,借此提高代碼的編譯速度霸旗。此外,它還簡化了我們的添加框架的操作艳狐。每個程序至少會用到幾個基本的框架窗宇,我們需要手動去添加這些框架滓玖,萬一忘記了添加某個框架,就會鏈接失敗师妙,我們就需要再去添加框架重新編譯诲侮。有了@import,它會自動幫我們做這些事镀虐,是不是方便又快捷。

  2. + function / - function
    第一次看到OC的函數(shù)前的+/- 符號的時候我以為是編譯器自帶的代碼隱藏于顯示的功能沟绪,后來發(fā)現(xiàn)我是圖樣啊刮便。原來,+代表函數(shù)是個靜態(tài)方法绽慈,即可以通過類名直接訪問恨旱;-代表時成員方法,需要實例化對象才能訪問坝疼。類似于C++中的static搜贤。

  3. MRC / ARC / AutoReleasepool
    OC的內(nèi)存管理不像Java那么方便,但是比C++要方便點钝凶。C++需要自己申請(new/malloc)和釋放(delete/free)資源仪芒,一不小心就會造成內(nèi)存泄漏,Java有自己的內(nèi)存回收機制,無需程序員手動執(zhí)行掂名。OC剛好在兩者之間据沈,它既是自動回收的,也需要程序員的命令饺蔑。
    當(dāng)一個對象的擁有方或者說引用計數(shù)為0時锌介,會釋放這個對象資源。
    在早期膀钠,OC時需要程序員使用手動引用計數(shù)(MRC, Manual Refrence Counting)的掏湾,維護一個retain計數(shù),程序要顯示地向?qū)ο蟀l(fā)送retain消息肿嘲,例如:

[anObject release]; // anObject失去一個擁有方
[anObject retain]; // anObject得到一個擁有方

這種方式帶來的問題是容易忘記發(fā)送release消息融击,導(dǎo)致內(nèi)存泄漏。特別是大規(guī)模項目中雳窟,這種問題尤為復(fù)雜尊浪。Apple為了結(jié)束這種“內(nèi)存管理黑暗時代”,開發(fā)類一款名為Clang的靜態(tài)分析器封救,可以找到程序中的內(nèi)存泄漏點拇涤。后來,基于此誕生了ARC(Automatic Refrence Counting),顧名思義誉结,就是自動幫你做引用計數(shù)管理了鹅士。

Automatic Reference Counting (ARC) is a compiler feature that provides automatic memory management of Objective-C objects. ARC works by adding code at compile time to ensure that objects live as long as necessary, but no longer. Conceptually, it follows the same memory management conventions as manual reference counting by adding the appropriate memory management calls for you.

自動釋放池是NSAutoreleasePool的實例。其中包含了收到autorelease消息的對象惩坑。當(dāng)一個自動釋放池自身被銷毀(dealloc)時掉盅,它會給池中每一個對象發(fā)送一個release消息(如果你給一個對象多次發(fā)送autorelease消息,那么當(dāng)自動釋放池銷毀時以舒,這個對象也會收到同樣數(shù)目的release消息)趾痘。這是一種延遲釋放的機制,等到釋放池被銷毀的時候釋放所有的對象蔓钟。雖然它表現(xiàn)的好像很自動永票,但是我們不知道它保留的對象真正在什么時候釋放,而且這種延遲釋放在臨時對象很多的時候也是造成很多內(nèi)存的浪費滥沫。

那么問題來了侣集,既然有了ARC,干嘛還要用autoreleasepool兰绣。前者頻繁釋放沒有什么不好啊肚吏,反而后者一起釋放會占用內(nèi)存。是的狭魂,但是前者是在編譯階段干好的時罚攀,當(dāng)我們遇到一些運行時需要解決的問題党觅,比如一個變量橫跨幾個作用域的時候,或者在多線程編程的時候斋泄。我還沒用到過杯瞻,暫且這么記著吧。

  1. 強引用 / 弱引用
    OC中大量使用指針炫掐,就是說一個對象是被另外一個對象指向的魁莉,術(shù)語叫做“擁有”,如果A對象擁有B對象募胃,同時B對象也擁有A對象旗唁,那么就造成一種強引用循環(huán)。這樣導(dǎo)致兩個對象都不能被釋放痹束,從而造成內(nèi)存泄漏检疫。于是乎,弱引用橫空出世了祷嘶。借用書中的說法是:

強引用會保留對象的擁有方屎媳,使其不被釋放;弱引用不會保留對象擁有方论巍。標(biāo)記為弱引用的實例變量或者屬性指向的對象可能會消失烛谊,此時這個實例變量或?qū)傩员恢脼閚il。

用weak屬性可以標(biāo)記弱引用嘉汰,如:
@property (nonatomic, weak) BNREmployee *holder; __weak BNRPerson *parent;

待補充......

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末丹禀,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鞋怀,更是在濱河造成了極大的恐慌双泪,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,946評論 6 518
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件接箫,死亡現(xiàn)場離奇詭異攒读,居然都是意外死亡朵诫,警方通過查閱死者的電腦和手機辛友,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,336評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來剪返,“玉大人废累,你說我怎么就攤上這事⊥衙ぃ” “怎么了邑滨?”我有些...
    開封第一講書人閱讀 169,716評論 0 364
  • 文/不壞的土叔 我叫張陵,是天一觀的道長钱反。 經(jīng)常有香客問我掖看,道長匣距,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,222評論 1 300
  • 正文 為了忘掉前任哎壳,我火速辦了婚禮毅待,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘归榕。我一直安慰自己尸红,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,223評論 6 398
  • 文/花漫 我一把揭開白布刹泄。 她就那樣靜靜地躺著外里,像睡著了一般。 火紅的嫁衣襯著肌膚如雪特石。 梳的紋絲不亂的頭發(fā)上盅蝗,一...
    開封第一講書人閱讀 52,807評論 1 314
  • 那天,我揣著相機與錄音县匠,去河邊找鬼风科。 笑死,一個胖子當(dāng)著我的面吹牛乞旦,可吹牛的內(nèi)容都是我干的贼穆。 我是一名探鬼主播,決...
    沈念sama閱讀 41,235評論 3 424
  • 文/蒼蘭香墨 我猛地睜開眼兰粉,長吁一口氣:“原來是場噩夢啊……” “哼故痊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起玖姑,我...
    開封第一講書人閱讀 40,189評論 0 277
  • 序言:老撾萬榮一對情侶失蹤愕秫,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后焰络,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戴甩,經(jīng)...
    沈念sama閱讀 46,712評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,775評論 3 343
  • 正文 我和宋清朗相戀三年闪彼,在試婚紗的時候發(fā)現(xiàn)自己被綠了甜孤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,926評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡畏腕,死狀恐怖缴川,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情描馅,我是刑警寧澤把夸,帶...
    沈念sama閱讀 36,580評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站铭污,受9級特大地震影響恋日,放射性物質(zhì)發(fā)生泄漏膀篮。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,259評論 3 336
  • 文/蒙蒙 一岂膳、第九天 我趴在偏房一處隱蔽的房頂上張望各拷。 院中可真熱鬧,春花似錦闷营、人聲如沸烤黍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,750評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽速蕊。三九已至,卻和暖如春娘赴,著一層夾襖步出監(jiān)牢的瞬間规哲,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,867評論 1 274
  • 我被黑心中介騙來泰國打工诽表, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留唉锌,地道東北人。 一個月前我還...
    沈念sama閱讀 49,368評論 3 379
  • 正文 我出身青樓竿奏,卻偏偏與公主長得像袄简,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子泛啸,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,930評論 2 361

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