Xcode里怎么使用c 调用oc的方法?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Xcode里怎么使用c 调用oc的方法?相关的知识,希望对你有一定的参考价值。

我想在c文件里去调用一个oc的方法,但是不知道如何下手啊,所以想请教各位大神帮忙解答一下。尽量详细点哦,附带代码参考一下就再好不过了,在这里先谢谢各位大神了

1.你的文件不能只是C类型的。下面我选择的类型是Foundation类型。

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[])


    @autoreleasepool

        // insert code here...

        NSLog(@"Hello, World!");

        int a[5]=1,2,3,4,5;

        NSArray * array = @[@"1",@"2",@"3",@"4"];

        NSLog(@"%@", array[1]);

   

    return 0;


导入了#import <Foundation/Foundation.h>就可以使用OC的方法,OC兼容C语言,像

        int a[5]=1,2,3,4,5;    

        NSArray * array = @[@"1",@"2",@"3",@"4"];

        NSLog(@"%@,%d", array[1],a[1]);

这样的写法,完全没有问题。


2.OC的方法不是类方法(+号开头)就是实例方法(-减号开头),这两种方法都需要有东西来调用。类方法通过类名调用,实例方法通过实例调用。而你的C文件,里面两者都不存在。所以,需要新建一个类,将方法写入到这个类中。然后,在C文件中,导入这个类,然后,就可以调用这个类相关的方法。

#import <Foundation/Foundation.h>

#import "OCQWE.h"

int main(int argc, const char * argv[])


    @autoreleasepool

        

        // insert code here...

        NSLog(@"Hello, World!");

        int a[5]=1,2,3,4,5;

        NSArray * array = @[@"1",@"2",@"3",@"4"];

        NSLog(@"%@,%d", array[1],a[1]);

        OCQWE *qcqwe =[[OCQWE alloc]init];

       int c = [qcqwe funWithNumber1:1 andNmuber2:4];

        NSLog(@"c=%d",c);

        int d =fun(3,5);

        printf("d=%d\\n",d);


   

    return 0;


int fun(int a,int b)

    return a+b;


输出结果为

2014-07-29 09:08:31.456 Test[715:303] Hello, World!

2014-07-29 09:08:31.457 Test[715:303] 2,2

2014-07-29 09:08:31.458 Test[715:303] c=5

d=8


#import <Foundation/Foundation.h>


@interface OCQWE : NSObject

-(int)funWithNumber1:(int)number1 andNmuber2:(int)number2;

@end


#import "OCQWE.h"


@implementation OCQWE

-(int)funWithNumber1:(int)number1 andNmuber2:(int)number2

    return number1+number2;

@end



参考技术A   oc语言中采用特定的语言调用类或者实例(对象)的方法称为发送消息或者方法调用。
  oc中方法的调用有两种:
  第一种:
  类名或对象名 方法名;
  [ClassOrInstance method];
  [ClassOrInstance method:arg1];
  [ClassOrInstance method1:arg2 method2:arg2];
  第二种:
  对象名.方法名; (点语法)
  [[ClassOrInstance method:arg1] otherMethod]; //嵌套发送消息
参考技术B 你这个应该是用C++去调用吧。

创建一个静态类 如
CppAdapter.h
CppAdapter.mm

h里面声明静态方法,
mm文件里实现。实现的时候即可用OC。

OC与swift相互调用

 

一、OC调用swift文件

二、swift调用OC文件

三、注意和总结

添加:

四、自定义桥接文件 

一、OC调用swift文件

  在OC项目中创建一个swift文件的时候,Xcode 会提示 需要创建一个桥接文件,点确定创建桥接文件,Xcode会自动创建一个桥接文件

名字:工程名-Bridging-Header.h

这个桥接文件是 swift 调用OC文件的时候用的

1、

  进入TARGETS ->Build Settings -> Packaging 中

设置Defines Module为YES

设置 Product Module Name ,也可以不设置,默认为工程的名字。这个在后面会用到

2、

  在swift写一个类

注意这个类一定要继承NSObject,不然在OC中没法用

 

class hello: NSObject {

    var address : String
    var gender: String
   
    init(address:String,gender:String){
        self.address = address
        self.gender = gender
    }
   
    func method() {
        print("message \(self.address + self.gender)")
    }
}

3、

  在OC需要用到的swift文件中 导入文件 "Product Module Name -Swift.h"  因为 Product Module Name 默认是工程的名字

所以直接导入 #import "工程名-Swift.h"

4、

  记着写完先command +B编译一下,如果没有报错就可以在OC文件调用swift中的类了

 

hello *helloss = [[helloalloc]initWithAddress:@"上海"gender:@"男"];
[helloss method];

 

二、swift调用OC文件

  在swift项目中创建一个OC文件的时候,Xcode 会提示创建一个桥接文件 点确定创建桥接文件,Xcode会自动创建一个桥接文件

名字:工程名-Bridging-Header.h

  把swift需要用到的OC文件的头文件放到桥接文件里 工程名-Bridging-Header.h

例如:

 

1、

这个就是一个OC文件
//#import "sec.h"
#import <UIKit/UIKit.h>
@interface sec : UIViewController
-(void)actionMake;
@end
 

2、

在桥接文件中把需要用到OC的头文件导入进去
#import "sec.h"
 

3、

编译一下,就可以在swift中用swift的语法调用OC文件的方法了
let second = sec()
second.actionMake()

 

三、注意和总结

 

注意:

1、OC项目在导入swift文件前 先按照系统提示创建桥接文件,
2、在 targets -> Build Settings -> Packaging  中设置Defines Module 为YES
3、在OC中调用swift文件的时候,swift中的类 要继承NSObject
不然没办法在OC中调用
4、OC中调用swift文件需要导入”工程名 -Swift.h"
     (这个是build Setting -> Packaging->Product Module Name 的名字,而这个属性默认是工程的名字)
5、写完记得command + B 编译 一下
6、swift项目 引用OC文件也需要创建 桥接文件,在这个桥接文件中导入OC文件的头文件
7、桥接文件只有一个,作用只是为了 swift 引用OC文件,OC引用swift 文件虽然也需要创建桥接文件
        但是不需要在桥接文件中 导入swift文件
8、如果一个项目既有OC引用swift 也有swift引用OC ,就先设置OC调用swift文件
     在桥接文件 导入OC文件,OC可以定义PCH文件导入”工程名 -Swift.h" 

 

 

四、自定义桥接文件 

 

 

如果不用Xcode提示创建桥接文件也可以自定义一个桥接文件

 

1     使用 Header File  把里面的内容清空。

 

2、 这文件名可以自定义, 一般还是用 工程名-Bridging-Header.h   例如app - file.h

 

3    然后在 Build Setting -> Swift Compiler - Code Generation中

 

4、设置Objective-C Bridging Header 为自定义的桥接文件相对于工程的绝对路径,也就是项目总文件夹的路径,如果在第一层,就直接写自定义的桥接文件的名file.h,如果在下一层,文件夹/桥接文件 app/file.h 

以上是关于Xcode里怎么使用c 调用oc的方法?的主要内容,如果未能解决你的问题,请参考以下文章

iOS在Xcode6中怎么创建OC category文件

iOS在Xcode6中怎么创建OC category文件

OC语言中创建了两个类A,B,在B中定义了一个A类型的对象a,a可以在B类中的方法里调用A类的方法吗?

如何在IOS平台上使用js直接调用OC方法

如何在IOS平台上使用js直接调用OC方法

如何在IOS平台上使用js直接调用OC方法