objective-c調用方法使用中括弧加冒號,相對主流的點加小括弧有什麼方便的地方?

java,C++等主流的語言都是點號跟方法,小括弧傳參數,相對之下,寫起objc的中括弧加冒號的形式有點彆扭,這種方式有沒有什麼情況下使用起來其實會更方便?


方括弧加冒號是為了兼顧消息傳遞機制和 C/C++ 兼容性,方便之處都在於消息傳遞機制,這種寫法本身沒什麼方便的。不要太在意,反正 ObjC 早就把鍵盤上能用的符號都用光了。

不過這樣可以把多個參數嵌入到方法名中構成一句通順的話。(就像 [square initWithWidth:10 andHeight:20]; 和 square.init(10, 20); 的區別),可讀性好,省得翻注釋和文檔了。

這樣我們還可以快速寫出長長的代碼,大大增加內心成就感。


搬運工:Objective-C

信息傳遞

Objective-C最大的特色是承自Smalltalk的信息傳遞模型(message passing),此機制與今日C++式之主流風格差異甚大。Objective-C里,與其說對象互相調用方法,不如說對象之間互相傳遞信息更為精確。此二種風格的主要差異在於調用方法/信息傳遞這個動作。C++里類型與方法的關係嚴格清楚,一個方法必定屬於一個類型,而且在編譯時(compile time)就已經緊密綁定,不可能調用一個不存在類型里的方法。但在Objective-C,類型與信息的關係比較鬆散,調用方法視為對對象發送信息,所有方法都被視為對信息的回應。所有信息處理直到運行時(runtime)才會動態決定,並交由類型自行決定如何處理收到的信息。也就是說,一個類型不保證一定會回應收到的信息,如果類型收到了一個無法處理的信息,程序只會拋出異常,不會出錯或崩潰。

C++里,送一個信息給對象(或者說調用一個方法)的語法如下:

obj-&>method(argument);

Objective-C則寫成:

[obj method: argument];

此二者並不僅僅是語法上的差異,還有基本行為上的不同。

這裡以一個汽車類(car class)的簡單例子來解釋Objective-C的信息傳遞特性:

[car fly];

典型的C++意義解讀是「調用car類型的fly方法」。若car類型裡頭沒有定義fly方法,那編譯肯定不會通過。但是Objective-C里,我們應當解讀為「發提交一個fly的信息給car對象」,fly是信息,而car是信息的接收者。car收到信息後會決定如何回應這個信息,若car類型內定義有fly方法就運行方法內之代碼,若car內不存在fly方法,則程序依舊可以通過編譯,運行期則拋出異常。

此二種風格各有優劣。C++強制要求所有的方法都必須有對應的動作,且編譯期綁定使得函數調用非常快速。缺點是僅能藉由virtual關鍵字提供有限的動態綁定能力。Objective-C天生即具備鴨子類型之動態綁定能力,因為運行期才處理信息,允許發送未知信息給對象。可以送信息給整個對象集合而不需要一一檢查每個對象的型態,也具備消息轉送機制。同時空對象nil接受信息後默認為不做事,所以送信息給nil也不用擔心程序崩潰。

Objective-C的方法調用因為運行期才動態解析信息,一開始信息比C++ virtual成員函數調用速度慢上三倍。但經由IMP高速緩存改善,目前已經比C++的virtual function快上50%[1]

[1] 根據維基百科上的內容,此句文字尚無確切來源。


沒有。不要覺得蘋果的屎都是香的。


多按了一個shift,還要寫明參數名,你怎麼會覺得方便?


省掉一部分寫注釋的時間算不?

其實打字的時間在編程時間裡比例極低,尤其是做稍微複雜點的事的時候基本可以忽略。何必糾結於多打幾個字元需要的時間呢?更何況都有自動補齊的話objc很多時候可以比c/c++按鍵次數少,要是記憶力不太好還能省點查文檔時間。。。

-- 補充 --

無論objc的括弧形式當年為什麼會設計出來,它最最方便的地方在於objc的代碼可以和c/c++任意混合而沒有語義衝突。這一點對於傳統c程序員來說實在太重要了。要是把括弧換成.或-&>,代碼混合就不可能實現。


避免和C/C++的語法摻合,方便一眼看出參數是幹嘛的


方便倒是不方便,但是加上參數名方便理解調用的方法啊!參數名就是對方法的最好注釋。

相比編碼敲鍵盤時多這一點時間的付出,後面再審查代碼時的方便。這點來說,我覺得太划得來了。

更何況,其實我們寫程序的時候,時間花得更多的是如何實現,而不是敲鍵盤那點時間。

所以新出的Swfit依然繼承了寫參數名的特點。


[self 把:(蘋果)和:(香蕉)攪拌在一起];

this-&>把攪拌在一起(蘋果,香蕉);

哪個讀的順口?

OC的方法命名絕對很口語化,基本一看方法名就知道方法是做什麼的了。


沒感覺有什麼方便的地方,倒Xcode經常會把中括弧加錯位置,浪費時間。鏈接調用的時候看起來也不舒服。

感覺是語法上的一個小缺陷,不是很影響日常使用。


推薦閱讀:

如何鑄就全棧程序員?
iOS 如何進行逆向工程?
android可以通過進入程序後台關閉運行程序達到減少內存佔用的目的,為什麼ios不行?
哪些 iOS 應用充分發揮了 64 位 A7 處理器的性能?
為什麼iOS偽後台,但是有很多軟體也會在後台一直運行?

TAG:編程語言 | 編程 | iOS開發 | Objective-C |