編寫高質量iOS代碼(一)

從開始接觸這門語言到現在也快兩年了,也是這門語言讓我輸出了第一個“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;

內存分配情形是這樣。

Snip20170513_1.png

在堆中的內存需要直接管理,而在棧中的內存在棧幀彈出時候自動清理。

在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,等“非對象類型”使用結構體就可以了。

總結要點:

  1. Objectice-C是C語言的“超集”,具有面向對象的特性。OC是使用動態綁定的消息結構,也就是說,在運行時才會檢查對象類型。接收一條消息后,究竟執行哪里的代碼,由運行環境決定而非編譯器決定。
  2. 理解C語言的核心概念,掌握內存模型與指針。
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,431評論 6 544
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,637評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,555評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,900評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,629評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,976評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,976評論 3 448
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,139評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,686評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,411評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,641評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,129評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,820評論 3 350
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,233評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,567評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,362評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,604評論 2 380

推薦閱讀更多精彩內容

  • *面試心聲:其實這些題本人都沒怎么背,但是在上海 兩周半 面了大約10家 收到差不多3個offer,總結起來就是把...
    Dove_iOS閱讀 27,198評論 30 471
  • 1.項目經驗 2.基礎問題 3.指南認識 4.解決思路 ios開發三大塊: 1.Oc基礎 2.CocoaTouch...
    陽光的大男孩兒閱讀 5,015評論 0 13
  • iOS面試小貼士 ———————————————回答好下面的足夠了------------------------...
    不言不愛閱讀 2,001評論 0 7
  • 多線程、特別是NSOperation 和 GCD 的內部原理。運行時機制的原理和運用場景。SDWebImage的原...
    LZM輪回閱讀 2,025評論 0 12
  • __block和__weak修飾符的區別其實是挺明顯的:1.__block不管是ARC還是MRC模式下都可以使用,...
    LZM輪回閱讀 3,354評論 0 6