從開始接觸這門語言到現在也快兩年了,也是這門語言讓我輸出了第一個“Hello World”,之間我用代碼量來衡量熟練度,寫的應用也挺多,給出功能,代碼信手拈來。
今年開春,自己接了個項目,在家一個月的時間寫了一個集成即時通訊,視頻語音聊天,和圖形資料展示的功能的應用,有將近40多個頁面吧,前后也只用了23天給了第一個版本,還小有成就感。
然后在家考駕照,做個小手術到今天重新出來找工作寫簡歷的時候,發現之前自己創造出來的孩子要么沒有人養了,要么就半死不活殘疾了,有的都搜索不到了。我心里大大的失落呀。
回過頭重新反省自己,可能自己寫的太爛了,畢竟才寫了不到兩年,沒有人養,代碼質量有一部分原因,所以重新開始把之前囫圇吞棗的知識反芻再細嚼慢咽下去。所以重新撿起書本,嚼吧,嚼吧,嚼吧。在學習之余,記錄下來,溫故而知新,并分享出去一起提高代碼質量吧。
了解objective-c
Objectiv-C 是在C語言基礎上添加了面向對象的一套全新語言,和java和c++不同,OC使用“消息結構”而非“函數調用”。oc 語言由smalltalk演化而來,后者是消息型語言的鼻祖。消息于函數調用之間的區別類似這樣。
// Messaging (objective-c)
Object *obj = [Object new];
[obj performWith: parameter1 and: parameter2];
(消息結構的語言,其運行時所執行的代碼由運行環境來決定)
//Function calling (c++)
Object *obj = new Object;
obj->perform(parameter1,parameter2);
(函數調用的語言,其由編譯器決定)
如果事例代碼中調用的函數是多態的話,在運行時是按照“虛方法表”來查出到底應該執行哪個函數,而采用消息結構的語言,不論多態,總是在運行時才會去查找要執行的方法。事實上編譯器甚至都不關心接收消息的對象是什么類型。接收消息的對象也在運行時進行處理,這個過程就叫“動態綁定”。
oc的重要工作都由“運行期組件”而非編譯器完成。使用oc的面相對象特性所需要的全部數據結構和函數都在運行期組件里,包括內存管理方法。
oc是c語言的“超集”所以c語言的所有功能在oc里面同樣適用,要寫高質量的oc代碼需要同時掌握c語言和oc語言的核心概念。尤其需要理解c語言的“內存模型”和“指針”對oc的內存應用計數的工作原理會有很大幫助。
在創建一個oc對象中
NSString str = @"Hello world!";
NSString代表指向NSSring型的指針,指針存儲在??臻g(stack)里面,稱為“棧幀”(在32位架構里面一個指針占4個字節,64位占8個字節),而指針指向的內容存儲在堆里面。
例如:
NSString *strOne = @"oneString";
NSString *strTwo = strOne;
內存分配情形是這樣。
在堆中的內存需要直接管理,而在棧中的內存在棧幀彈出時候自動清理。
在oc代碼中,類是CGRect這種不帶* 符號的變量,這些變量不存儲在堆空間里面,而是會使用??臻g。
CGRect frame;
frame.origin.x = 0.0f;
frame.size.width = 100.f;
.
.
.
CGRect是一個C的結構體,定義是:
struct CGRect{
CGPoint origin;
CGSize size;
};
typedef struct CGRect CGRect;
如果使用對象來做會影響性能。應為相比對象,結構體不需要開辟堆空間,就不需要分配釋放內存等問題。通常如果只需要保存int,float,char,等“非對象類型”使用結構體就可以了。
總結要點:
- Objectice-C是C語言的“超集”,具有面向對象的特性。OC是使用動態綁定的消息結構,也就是說,在運行時才會檢查對象類型。接收一條消息后,究竟執行哪里的代碼,由運行環境決定而非編譯器決定。
- 理解C語言的核心概念,掌握內存模型與指針。