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)存模型與指針太闺。