2012-03-02 93 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写

相关问题