2012-11-16 46 views
5

我可以定義C函數和變量Objective-C類裏面執行這樣的:Objective-C類實現中的C函數和變量?

@implementation MyViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    cfunction(); 
} 

// variable inside class 
NSString *message = @"this is c function inside objective-c class"; 

// c function inside class 
void cfunction() { 
    NSLog(@"%@", message); 
} 

@end 

結果

this is c function inside objective-c class 

此代碼的工作沒有任何警告和錯誤。
它有效的Objective-C代碼?
在Objective-C類中定義變量和c函數是否安全?
是否有關於此語言規範的文檔?

+0

看到基礎框架 - 幾乎所有的C –

+0

@JustinMeiners謝謝!但是這個問題不是「我可以在Objective-C中使用C嗎?」。 –

+0

我看到 - 更多關於客觀C類的信息 –

回答

2

是的,這是正確和安全的,但你應該儘量避免它。如果你需要有一些C函數,把它定義在一個單獨的文件中(並將它聲明在一個單獨的頭文件中)。從技術上講,Obj-C是C語言之上的一個薄層,您可以在Obj-C源代碼中的任何位置使用任何C特性。但是,您應該遵守編碼風格,不要混用這兩種語言。

+1

「你應該符合編碼風格,不要混合兩種語言。」 - *其中*編碼風格?如何*不混合*「兩種」語言?如果我寫' - (int)foo {return 1 + 2; }',只是因爲'1 + 2'本身就是一個C表達式? – 2012-11-16 15:08:35

+0

我的意思是不要混合例如C結構和Obj-C對象。不要混合C-函數和Obj-C方法。 – kuba

+0

@kuba謝謝!在普通的C中,'cfunction()'必須在'-viewDidLoad'之前定義。 但是,如果我在@implementation和@end之間定義了'cfunction()','cfunction()'可以在'-viewDidLoad'之後定義。正如H2CO3所說,「函數可以直接訪問一個對象的私有和受保護的ivars'。 我認爲在@implementation中定義c函數不僅僅是c語言。但我找不到文檔。 –

2

它有效的Objective-C代碼?

是的。

在Objective-C類中定義變量和c函數是否安全?

是的。在類中定義的函數的一個特定屬性是這些函數可以直接訪問作爲指定類的實例的對象的私有和受保護的ivars。

是否有關於此語言規範的文檔?

看到周圍this SO question.

+0

謝謝。但我找不到[SO問題]中的文檔(http://stackoverflow.com/questions/801976/mixing-c-functions-in-an-objective-c-class)。如果沒有文檔,依靠該功能是否危險? –

1

對不起球員的討論中,以前的答案是在它的第三部分非常錯誤的。

實現在Objective-C類的@implementation中的C函數不是該類的方法,而是簡單的全局C函數。

當然,可以在那裏寫出它們,有時甚至是有益的,因爲它們是「私人的類」 - 其他代碼不會看到它們,因爲它們被限制在@implementation中。

但是 - 他們不能訪問任何iVars,或自我,或超級,或任何與類或實例相關的東西。它們是C函數而不是Obj-C方法。

任何試圖訪問iVars或self或super等的嘗試都會產生一個編譯器錯誤,指出「symbol xxx is unknown」。

0

除了所有其他的答案(尤其是Motti的):

您可以通過前綴的「靜態」關鍵字的C函數。 '靜態'意味着它只能從它存在的C文件中使用該函數。它不可能從C文件之外導出或調用它。例如,如果你在頭文件中有一個靜態函數,你會得到它的多個副本。

它是如此簡單:

原型:

static void cfunction(); 

實現:

static void cfunction() { 
    NSLog(@"%@", message); 
} 

- 現在嘗試從代碼在不同的源文件調用它。

...並且混合Objective-C和C沒有什麼不對。一般而言:Objective-C是呆滯。 C++是和C是相當快的。因此,如果您有很多調用的子例程(或內聯函數),請使用這些C函數而不是Objective-C,因爲ObjC會將您的循環向下拖動。