2012-03-02 57 views
3

我很困惑在Objective-C項目中找到C風格的語法(例如,下面的語法並不是在本書中Objective-C中定義的方法)。我清楚,這是可行的,因爲我編譯的代碼沒有錯誤 - 但我不知道如何以及爲什麼,這段代碼是普通的Objective-C .h, .m文件。有人可以解釋這是如何適應?我們可以用C語言的語法編寫Objective-C代碼嗎?

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
//use of round brackets 

void drawLinearGradient(CGContextRef context, CGRect rect, CGColorRef startColor, 
CGColorRef endColor); 
// C style syntax for passing params 

而且這大約是我迄今所看到的核芯顯卡的代碼非常具體的,是它讓編寫正Objective-C的方法,這樣也還是隻能用CG代碼文件...?

回答

4

Objective-C的只是一個C的超集,在同一作爲C++的方式。 (兩者最初都是作爲將代碼轉換爲直接C代碼的預處理程序來實現的。)Objective-C方法調用被轉換爲調用C函數objc_msgSend()(及其變體),並且可能(儘管繁瑣)直接調用它。

底層細節在這裏闡明:

https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html

+0

是否有任何指引或編寫代碼這是Objective-C和純C的組合時,經驗法則。 (如內存管理,鑄造等) – dotnetcoder 2012-03-02 05:14:51

+0

這是否意味着,我可以編寫一個Objective-C類,並有一個c-stye方法,它似乎有點奇怪,但是有意義。 – dotnetcoder 2012-03-02 05:18:27

+0

沒有超出Objective-C的規則,因爲所有Objective-C代碼都是這樣的「混合」。 Obj-C對象只是普通的指針,可以這樣對待。如果您不使用ARC,請注意Obj-C所有權規則(請參閱https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html)並使用Obj-C API在適當的情況下,例如,不要在Obj-C對象上調用free(),請使用release方法。 – davehayden 2012-03-02 05:27:34

3

核心圖形是一個C API,而不是Objective-C。由於Objective-C是C的超集,任何有效的C代碼都可以在.m文件中編譯得很好。

2

Objective-C是C的超集,因此您可以在.m文件中定義普通的舊C函數,並且可以使用普通的C語法在.m文件中調用普通的舊C函數。

CGColorSpaceCreateDeviceRGB函數是一個普通的舊C函數。它是Core Graphics框架(也稱爲Quartz 2D)的一部分,它具有純粹的C API - API只使用純C而不是Objective-C。

您不能使用普通的舊C函數語法定義Objective-C對象方法 - 您必須使用Objective-C方法語法。你不應該嘗試使用普通的舊C語法向Objective-C對象發送消息 - 你應該使用Objective-C消息發送語法(方括號)。

0

objc支持標準C,爲什麼你在objc項目中找到c代碼。

至於蘋果公司提供的框架,如果它有core前綴,像CG站立core graphic,它通常意味着它是用C寫

相關問題