2012-10-17 61 views
1

我有一個C文件和一個Objective C文件。
即,C文件是:CB.mCB.h
CB.m包含c函數:callIncomings()。這個函數必須是C函數,因爲它是一個回調函數。 (其簽名不可更改)指向外部對象的指針爲零

目標C文件是ViewController.h/.xib/.mIncomingCall.h/.m/.xib

現在, 我宣佈ViewController.h以下

static ViewController* varViewController; 

viewDidLoad,我給你:

varViewController = self; 

,我已經將下面的代碼CB.m

#include <stdio.h> 
#import "ViewController.h" 
#import "IncomingCall.h" 

int callIncomings(int a, char* b) 
{ 

    IncomingCall *obj = [[IncomingCall alloc]initWithNibName:@"IncomingCall" bundle:nil]; 
    //NSString *temp = 
    //NSString* string = 
    obj.tempAddress = [NSString stringWithFormat:@"%s" , b]; 

    [obj setModalTransitionStyle:UIModalTransitionStylePartialCurl]; 
    [varViewController presentModalViewController:obj animated:YES]; 

    [obj release]; 

    return 1; 
} 

該功能在以下位置調用:

- (IBAction)DemoCall:(id)sender { 
    callIncomings(1, "from C file");  
} 

該項目生成良好,但沒有顯示IncomingCall()視圖。

有什麼想法爲什麼?

編輯:另外,我想知道,如果我想概括C函數並加載一些不同的視圖說ABCD.view或IncomingCall視圖,我該如何概括此函數。

編輯2:這個問題可以是一個連續性從這裏:C function calling objective C functions

一些澄清: 當我把callIncoming功能在viewcontroller.m文件,它工作得很好。但是現在我想單獨放置在另一個文件中,並因此放置CB.m文件。
因此,這回答了你對varViewController的懷疑。 DemoCall函數在ViewController文件中,如果你注意到它是一個IBAction,那麼,函數IncomingCall肯定會被調用。

輸入:是的,像有人指出的那樣,它的真實性,varViewController似乎是NULL。怎麼辦??!!我在哪裏錯了? 。 enter image description here

+0

這兩個源文件都是Objective-C('.m')而不是C('.c')。 – trojanfoe

+0

okie,那麼更改文件擴展名解決問題?即將Cb.m改爲CB.c – Vinayaka

+2

你測試了你的'varViewController'變量嗎?你確定它已經被初始化了,而不是'nil'嗎?你說它是在'ViewController'的'viewDidLoad'中調用的,但是它被調用了嗎? – Guillaume

回答

4

的問題是與聲明:

static ViewController* varViewController; 

ViewController.h

static關鍵字表示變量將在包含該頭文件的每個源文件中在本地創建(它具有內部鏈接)。因此,在CB.m中使用的varViewController不同的(未初始化)指向ViewController.m中的實際指針。

更正此錯誤使用:

extern ViewController* varViewController; 

(並確保它不被定義爲內ViewController.mstatic,否則你會得到一個鏈路故障)。

0

寫下面的代碼...

#include <stdio.h> 
#import "ViewController.h" 
#import "IncomingCall.h" 


static int callIncomings(int a, char* b); 
+0

多一點解釋Prasad,會有所幫助。 – Vinayaka

相關問題