2016-11-14 47 views
1

我知道,調用一個方法的實例,如[object theMethod]是一個消息,要求該實例執行一個動作(一個名爲theMethod的方法)。[object method]與CGRectMake或NSRangeMake之間的區別

對於CGRectMake,Apple的documentation沒有幫助。

例如:

當將消息發送到一個實例編譯器轉換的消息表達式:

[receiver message] 

入到消息傳遞函數的調用,objc_msgSend。 該函數將接收器,並且該方法的信息,也就是說,該方法選擇器作爲它的兩個主要參數中提到的名字:

objc_msgSend(receiver, selector) 

在該消息中傳遞的任何參數也被交給objc_msgSend:

objc_msgSend(receiver, selector, arg1, arg2, ...) 

但是CGRectMake呢?該功能位於哪裏?調用函數時主要區別(過程)是什麼?

更新:內存呢?例如,塊在堆棧中創建。 CGRectMake怎麼樣?

+0

請用您需要幫助的代碼的一些特定示例更新您的問題。 – rmaddy

+0

'[object theMethod]'是Objective-C的語義,而像'CGRectMake()'這樣的函數是一個內聯的C函數調用。請參閱http://stackoverflow.com/questions/6207440/what-does-cg-inline-do。 – fullofsquirrels

+0

我認爲這與Objective-C無關。這更多的是關於OOP與非OOP。像C vs C++,結構vs對象,(對象/類)方法vs函數等等。我認爲,即使這是一個有趣的問題,它是相當廣泛的,因爲它需要很長的答案,利弊等。 – Larme

回答

6

方法和「普通函數」之間的區別是Objective-C作爲一個相對簡單的C包裝的傷心後果。一些類型被認爲過於輕量級而不能實現爲類使用struct s或其他更原始的類型,並附有簡單的C函數或宏來與它們一起工作。在Xcode您可以命令單擊一個函數名,看的聲明和定義:

// CoreGraphics/CGGeometry.h 
struct CGRect { 
    CGPoint origin; 
    CGSize size; 
}; 
typedef struct CGRect CGRect; 

CG_INLINE CGRect 
CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height) 
{ 
    CGRect rect; 
    rect.origin.x = x; rect.origin.y = y; 
    rect.size.width = width; rect.size.height = height; 
    return rect; 
} 

至於調用不同,你大多已經認識他們。消息被翻譯成objc_msgSend,而諸如CGRectMake之類的函數是普通的C函數或具有通常語義的宏。

相關問題