我有一个C文件和一个Objective C文件
即,C文件为:CB.m
和CB.h
CB.m
包含c函数:callIncomings()
。此函数必须是C函数,因为它是一个回调函数。 (其签名无法更改)
Objective C文件是,ViewController.h/.xib/.m
和IncomingCall.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。怎么办??!!我哪里错了? 。
答案 0 :(得分:4)
问题在于声明:
static ViewController* varViewController;
ViewController.h
中的。
static
关键字表示将在包含该头文件的每个源文件中创建本地(它具有内部链接)变量。因此,varViewController
中使用的CB.m
是指向ViewController.m
中实际值的不同(未初始化)指针。
使用以下方法更正此错误:
extern ViewController* varViewController;
(并确保static
内未将其定义为ViewController.m
,否则会导致链接失败。
答案 1 :(得分:0)
编写以下代码......
#include <stdio.h>
#import "ViewController.h"
#import "IncomingCall.h"
static int callIncomings(int a, char* b);