2014-03-29 77 views
1

這個問題說明了一切。爲什麼:爲什麼Objective-C語法塊的語法與方法語法如此不同?

(void)methodWithParamA:(id)paramA paramB:(id)paramB; 
[obj methodWithParamA:valA paramB:valB]; 

和:

void(^ block)(id paramA, id paramB); 
block(valA, valB); 

我不知道我會一定通過學習這個問題的答案,是否有所收穫,但我百思不得其解的是一個語言可以有這麼多不同的語法...

+4

後者是(幾乎)普通的C,Objective C中的很多非對象相關的東西。方括號的東西是Objective C擴展到處理對象的語言。這方面的語言與C完全不同,但是保持了很多類似C的風格(主要是我相信與C庫標題兼容)。 – Dave

+1

[這裏是一個很好的帖子](http://nilsou.com/blog/2013/08/21/objective-c-blocks-syntax/)關於這個主題,可以幫助你 – Alladinian

+0

@Dave - 後者是純C 。它幾乎不是普通的C. https://en.wikipedia.org/wiki/Blocks_(C_language_extension) – ArtOfWarfare

回答

3

A嵌段是功能,沒有「當前實例」(或者「當前級」呼叫方法)作爲具有方法

塊調用因此看起來像一個函數調用; 「塊」類型是一種指針類型,並且非常接近函數指針類型的語法;一個塊體緊跟着一個函數體的語法。

C支持塊,它具有函數但不包含方法。

+0

讀這個讓我問對應的問題:爲什麼square Objective-C方法的-bracket-space-delimited-params語法?我現在正在學習塊,並且認爲它們在語法上與方法有很大不同,這很奇怪。閱讀你的解釋,模塊是基於C函數,現在我回到了奇怪的Objective-C方法看起來像他們... – ericsoco

+0

我想@Dave在他的評論上面回答了這個問題 - Objective-C方法來自C函數後,語言創建者決定他們需要一個完全不同的語法。嘆。 – ericsoco

+1

@ericsoco - 在Objective-C中,您*調用*函數,而您*發送消息*到對象以調用方法。這兩個過程是完全不同的。前者是直接的和靜態的 - 它決定了你在編譯時的最終位置。後者是間接和動態的 - 在運行時執行搜索以找到匹配消息的方法,這可能會失敗。因此,使用不同的語法很有意義,語法遵循Smalltalk。在C++中,方法調用與函數調用不同,它們使用類似的語法。 – CRD