【高質(zhì)量Objective-C-2】第1條:了解Objective-C語言的起源

Objective-C:

類似于面向?qū)ο蟮恼Z言C++捞慌、Java,

但OC與它們有很多不同捶枢。

若用過某種面向?qū)ο笳Z言,

則很容易理解OC所用的范式與模板飞崖。

【一烂叔、語言按照方法的調(diào)用方式,分兩類】

1.“消息結構”語言(messaging structure)

2.“函數(shù)調(diào)用”語言(function calling)固歪。

Smalltalk是消息型語言的鼻祖蒜鸡。

OC由Smalltalk演化而來胯努,

即:OC采用消息結構語言。

區(qū)別:

比較:

動態(tài)綁定

編譯器不關心接收消息的對象的類型逢防;

由運行時環(huán)境決定接收消息的對象叶沛。

(參見第11條)

靜態(tài)綁定:

編譯期,由編譯器決定調(diào)用的方法忘朝。


【二灰署、OC的運行時組件:Objective-C Runtime Component

作用:完成OC的許多重要工作。

包含:OC的面向?qū)ο蟮娜繑?shù)據(jù)結構與方法局嘁。

本質(zhì):是與開發(fā)者所編寫的代碼相鏈接的“動態(tài)庫”(Dynamic Library)溉箕。

它能粘合開發(fā)者寫的代碼。

“運行時”語言:更新運行時組件悦昵,

即可提升應用程序性能肴茄。

“編譯時”語言:這種語言的許多工作,

都在“編譯期”(compile time)完成旱捧,

所以独郎,要提升性能,只能重新編譯應用程序代碼枚赡。

OC是C的超集氓癌,故OC代碼包含了C語言所有功能。

必須同時掌握OC與C的核心概念贫橙,

才能寫出高效OC代碼贪婉。


【三、內(nèi)存模型(memory model)——1.分配內(nèi)存】

注意:理解C語言的內(nèi)存模型(memory model)卢肃,

有助于理解OC的內(nèi)存模型及“引用計數(shù)”(Reference Counting)機制的工作原理疲迂。

前提:要理解內(nèi)存模型,

需先明白OC的指針用來指示一個對象莫湘。

【例一】

要求:聲明一個變量someString尤蒿,

是NSString類型;

它指向堆上的某塊內(nèi)存幅垮,

該內(nèi)存塊中存放了一個NSString對象腰池。

語句:NSString* someString =@"The string";

作用:該語法照搬了C語言的實現(xiàn),

1.聲明了一個變量someString忙芒,類型為NSString*示弓。

即:變量someString是NSString類型的指針。

即:在當前棧中呵萨,分配了一塊內(nèi)存奏属,

該內(nèi)存大小可以放一個指針。

(32位計算機上是32位潮峦,即4字節(jié)囱皿;

64位計算機上勇婴,是8字節(jié))。

2.令其指向某個對象铆帽。

這里咆耿,指向字符串@"The string”的地址,

即:棧中分配的內(nèi)存空間爹橱,

存放了字符串@"The string”的首地址萨螺。

注意:OC的對象必須分配在“堆空間”(Heap Space),

絕對不允許分配在棧(Stack)上愧驱。

錯誤:NSString stackString;

分析:error: interface type cannot be statically allocated

【淺拷貝】

【例二】

要求:再創(chuàng)建一個變量慰技,

令其指向變量someString的同一地址,

不拷貝該對象组砚,

只是這兩個變量會同時指向該對象:

語句:

NSString*someString = @"The string";

NSString*anotherString = someString;

注意:這時吻商,只有一個NSString對象(實例),即:@"The string”糟红。

但有兩個變量指向該對象艾帐。

這兩個變量都是NSString*型,

這說明當前“棧幀”(stack frame)里分配了兩塊內(nèi)存盆偿,

每塊內(nèi)存的大小都能容下一枚指針

(在32位架構的計算機上是4字節(jié)柒爸,

64位計算機上是8字節(jié))。

這兩塊內(nèi)存里的值都一樣事扭,

就是NSString實例的內(nèi)存地址捎稚。

圖示:

圖1-1描述了此時的內(nèi)存布局。

存放在NSString實例中的數(shù)據(jù)求橄,

含有代表字符串實際內(nèi)容的字節(jié)今野。



【三、內(nèi)存模型(memory model)——2.管理內(nèi)存】

(1)內(nèi)存管理原則:

1.堆中分配的內(nèi)存罐农,必須程序員直接管理条霜;

2.棧上分配的內(nèi)存,

會在其棧幀彈出時涵亏,由系統(tǒng)自動清理宰睡。

(2)OC的內(nèi)存管理:“引用計數(shù)”(參見第29條)

OC將堆內(nèi)存管理抽象出來了。

不需要調(diào)用malloc及free來分配或釋放對象所占的內(nèi)存空間溯乒。

OC運行時環(huán)境夹厌,采用的內(nèi)存管理架構豹爹,

叫“引用計數(shù)”裆悄。

(3)OC中在棧空間存放的特殊對象

在OC代碼中臂聋,可以定義不含*的變量光稼,

它們可能會使用“椈蚰希空間”(stack space)。

這些變量艾君,所保存的不是OC對象采够。

例如:CoreGraphics框架中的CGRect。

CGRect frame;

frame.origin.x = 0.0f;

frame.origin.y = 10.0f;

frame.size.width = 100.0f;

frame.size.height = 150.0f;

CGRect是C結構體冰垄,其定義是:

structCGRect{

CGPoint origin;

CGSize size;

};

typedef struct CGRect CGRect;

說明:

整個系統(tǒng)框架都使用這種結構體蹬癌,

如果改用OC對象來處理,則會影響性能虹茶。

與創(chuàng)建結構體相比逝薪,

創(chuàng)建對象還需要額外開銷,

如:分配及釋放堆內(nèi)存等蝴罪。

如果只需保存int董济、float、double要门、char等

“非對象類型”(no nobject type)虏肾,

則通常使用CGRect這種結構體就可以了。

建議讀者先看C語言教程欢搜,

在熟悉其語法后封豪,再開始學習編寫OC代碼。

否則狂巢,某些OC語法撑毛,也許會令你困惑。

【第一條——記住要點】

1.OC是C的超集唧领。

C語言藻雌,是面向過程的語言。

OC語言斩个,增加了面向?qū)ο筇匦浴?/p>

OC胯杭,使用動態(tài)綁定的消息結構,

即:在運行時受啥,才會檢查對象類型做个。

接收一條消息之后,究竟應執(zhí)行何種代碼滚局,

由運行期環(huán)境(而非編譯器)來決定居暖。

2.理解C語言的核心概念,

有助于寫好Objective-C程序藤肢。

尤其要掌握內(nèi)存模型與指針太闺。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市嘁圈,隨后出現(xiàn)的幾起案子省骂,更是在濱河造成了極大的恐慌蟀淮,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钞澳,死亡現(xiàn)場離奇詭異怠惶,居然都是意外死亡,警方通過查閱死者的電腦和手機轧粟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門策治,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人兰吟,你說我怎么就攤上這事览妖。” “怎么了揽祥?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵讽膏,是天一觀的道長。 經(jīng)常有香客問我拄丰,道長府树,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任料按,我火速辦了婚禮奄侠,結果婚禮上,老公的妹妹穿的比我還像新娘载矿。我一直安慰自己垄潮,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布闷盔。 她就那樣靜靜地躺著弯洗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪逢勾。 梳的紋絲不亂的頭發(fā)上牡整,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音溺拱,去河邊找鬼逃贝。 笑死,一個胖子當著我的面吹牛迫摔,可吹牛的內(nèi)容都是我干的沐扳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼句占,長吁一口氣:“原來是場噩夢啊……” “哼沪摄!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤卓起,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后凹炸,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戏阅,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年啤它,在試婚紗的時候發(fā)現(xiàn)自己被綠了奕筐。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡变骡,死狀恐怖离赫,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情塌碌,我是刑警寧澤渊胸,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站台妆,受9級特大地震影響翎猛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜接剩,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一切厘、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧懊缺,春花似錦疫稿、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至俊扳,卻和暖如春员萍,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拣度。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工碎绎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抗果。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓筋帖,卻偏偏與公主長得像,于是被迫代替她去往敵國和親冤馏。 傳聞我的和親對象是個殘疾皇子日麸,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

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