精华内容
参与话题
问答
  • iOS C++/OC 混编

    2018-11-08 20:39:22
    iOS C++/OC 混编

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

    也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                   

    转自:http://blog.csdn.net/fengsh998/article/details/8010696

    Objective-C和C++混编的要点
    在 Objective-C++中,可以用C++代码调用方法也可以从Objective-C调用方法。在这两种语言里对象都是指针,可以在任何地方使用。例 如,C++类可以使用Objective-C对象的指针作为数据成员,Objective-C类也可以有C++对象指针做实例变量。下例说明了这一点。
    注意:Xcode需要源文件以".mm"为扩展名,这样才能启动编译器的Objective-C++扩展。

    C++词汇歧义和冲突
    OC头文件中定义了一些标识符,所有的OC程序必须包含的,这些标识符识id,Class,SEL,IMP和BOOL。
    OC方法内,编译器预声明了标识符self和super,就想C++中的关键字this。跟C++的this不同的是,self和super是上下文相关的;OC方法外他们还可以用于普通标识符。
    协议内方法的参数列表,有5个上下文相关的关键字(oneway,in,out,inout,bycopy)。这些在其他内容中不是关键字。
    从 OC程序员的角度来看,C++增加了不少新的关键字。你仍然可以使用C++的关键字做OC selector的一部分,所以影响并不严重,但你不能使用他们命名OC类和实例变量。例如,尽管class是C++的关键字,但是你仍然能够使用 NSObject的方法class:

    1. [foo class]; // OK

    然而,因为它是一个关键字,你不能用class做变量名称:

    1. NSObject *class; // Error

    OC里类名和分类名有单独的命名空间。@interface foo和@interface(foo)能够同时存在在一个源代码中。OC++里,你也能用C++中的类名或结构名来命名你的分类。
    协议和template标识符使用语法相同但目的不同:

    1. id<someProtocolName> foo;
    2. TemplateType<SomeTypeName> bar;

    为了避免这种含糊之处,编译器不允许把id做template名称。 最后,C++有一个语法歧义,当一个label后面跟了一个表达式表示一个全局名称时,就像下面:

    1. label: ::global_name = 3;

    第一个冒号后面需要空格。OC++有类似情况,也需要一个空格:

    1. receiver selector: ::global_c++_name;


    限制
    OC++ 没有为OC类增加C++的功能,也没有为C++类增加OC的功能。例如,你不能用OC语法调用C++对象,也不能为OC对象增加构造函数和析构函数,也不 能将this和self互相替换使用。类的体系结构是独立的。C++类不能继承OC类,OC类也不能继承C++类。另外,多语言异常处理是不支持的。也就 是说,一个OC抛出的异常不能被C++代码捕获,反过来C++代码抛出的异常不能被OC代码捕获。


    原文网址:http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocCPlusPlus.html


    iPhone开发中,在XCode下混合编译

    C++/Objective-C

         
       

    先说题外话,文章标题其实起的不好,在iOS的开发中,Apple建立的库基本都是用Objective-C写的,所以在这里的C++指的其实

    是Objective-C++。

    首先,最最最要紧的事情,不是代码而是编译器选项,在做混合编译之前一定要把编译器的Compile Sources As选项改为Objective C++。

    默认的选项是According to file type,用这个的话,你后面每个不在交叉行列里的类都OK,一旦两种语言在一个文件中相互调用,

    就会报错,而且报的错怪的很,比如:找不到new,找不到delete,等等。

    既然是调用嘛,肯定要有来有往,先说说,在C++中如何调用Objective-C:(参考这个,我略做修改)

    1. 封装Objective-C的对象函数变为C的函数接口

    2. 写一个对应的C++类调用

    说起来简单,看看例子就知道什么情况了。

    //MyObject-C-Interface.h#ifndef __MYOBJECT_C_INTERFACE_H__#define __MYOBJECT_C_INTERFACE_H__ 1int MyObjectDoSomethingWith (void *myObjectInstance, void *parameter);#endif//MyObject.h#import "MyObject-C-Interface.h"@interface MyObject : NSObject{    int someVar;}- (int) doSomethingWith:(void *) aParameter;@end//MyObject.m#import "MyObject.h"int MyObjectDoSomethingWith (void *self, void *aParameter){    return [(id) self doSomethingWith:aParameter];}@implementation MyObject- (int) doSomethingWith:(void *) aParameter{    // ... some code    return 1;}@end//MyCPPClass.h#ifndef __MYCPPCLASS_H__#define __MYCPPCLASS_H__class MyCppClass{public:     int MyCPPClass::someMethod (void *objectiveCObject, void *aParameter);}#endif//MyCPPClass.cpp#include "MyCPPClass.h"#include "MyObject-C-Interface.h"int MyCPPClass::someMethod (void *objectiveCObject, void *aParameter){    return MyObjectDoSomethingWith (objectiveCObject, aParameter);}

    如上面所示,先搞个弱类型的C函数接口,然后在Objective C的类中实现该接口。最后,在C++的类中调用弱类型,和弱接口。

    在工程主体框架是用Objective-C写成的前提下,上面的这种调用并不实用,完全是技术可能性的研究。说白了,

    就是骗骗编译器玩,同时也失去了C++优雅的强类型特性。

    下面这个才是真金白银有用的,在Objective-C代码下调用C++类代码:

    1. 建立一个C++类

    2. 写一个Adaptor的Objective-C类

    3. 在其他Objective-C的逻辑中调用Adaptor类。

    还是代码:)

    ////  CPlusPlusClass.h//  MixCompileTest////  Created by biosli on 11-4-30.//  Copyright 2011 __MyCompanyName__. All rights reserved.//#ifndef __CPLUSPLUS_CLASS_H__#define __CPLUSPLUS_CLASS_H__class CPlusPlusClass {public:    CPlusPlusClass();    virtual ~CPlusPlusClass();    void func();    void setInt (int i) {        m_i = i;    }    private:    int m_i;};#endif////  CPlusPlusClass.mm//  MixCompileTest////  Created by biosli on 11-4-30.//  Copyright 2011 __MyCompanyName__. All rights reserved.//#include <stdio.h>#include "CPlusPlusClass.h"CPlusPlusClass::CPlusPlusClass() : m_i(0) {    printf("CPlusPlusClass::CPlusPlusClass()\n");    func();}CPlusPlusClass::~CPlusPlusClass() {    printf("CPlusPlusClass::~CPlusPlusClass()\n");}void CPlusPlusClass::func() {    printf("CPlusPlusClass func print: %d\n", m_i);}////  ObjectiveCAdaptor.h//  MixCompileTest////  Created by biosli on 11-4-30.//  Copyright 2011 __MyCompanyName__. All rights reserved.//#import <Foundation/Foundation.h>class CPlusPlusClass; //这个声明得小心,千万不要写成@class,兄弟我搞了半宿才找到这个错误。呵呵,见笑,见笑。@interface ObjectiveCAdaptor : NSObject {@private    CPlusPlusClass *testObj;}- (void) objectiveFunc;@end////  ObjectiveCAdaptor.m//  MixCompileTest////  Created by biosli on 11-4-30.//  Copyright 2011 __MyCompanyName__. All rights reserved.//#import "ObjectiveCAdaptor.h"#include "CPlusPlusClass.h"@implementation ObjectiveCAdaptor- (id) init {    if (self = [super init]) {        testObj = new CPlusPlusClass();    }        return self;}- (void) dealloc {    if (testObj != NULL) {        delete testObj;        testObj = NULL;    }    [super dealloc];}- (void) objectiveFunc{    testObj->setInt(5);    testObj->func();@end//调用示例:- (void) callObjectiveCAdaptorMethod{    ObjectiveCAdaptor *testObjectiveCObj = [[ObjectiveCAdaptor alloc] init];    [testObjectiveCObj objectiveFunc];    [testObjectiveCObj release];}

    上面这个例子演示了创建C++类,创建Objective-C的Adaptor类,和最后调用的全过程。

    在编写混合编译代码时一定要记住一个原则,Objective-C++这个东东包含了Objective-C和C++的所有关键字和符号,

    所以在编写交叉编译代码时,千万不要用混本来就很像的关键字和符号。

    参考资料:

    具体的代码限制:请参考《Objective-C和C++混编的要点》

    混合编译好处多,这篇文章叙述的相当到位《Strategies for Using C++ in Objective-C Projects》

               

    给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow

    这里写图片描述
    展开全文
  • ios c++混编

    2016-05-11 16:32:19
    苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C++和Objective-C,混编后的语言叫Objective-C++。有了它,你就可以在Objective-C应用程序中使用已有的C++类库。Objective-C和C++混编的要点 在...

    Using C++ With Objective-C
    苹果的Objective-C编译器允许用户在同一个源文件里自由地混合使用C++和Objective-C,混编后的语言叫Objective-C++。有了它,你就可以在Objective-C应用程序中使用已有的C++类库。

    Objective-C和C++混编的要点
    在Objective-C++中,可以用C++代码调用方法也可以从Objective-C调用方法。在这两种语言里对象都是指针,可以在任何地方使用。例如,C++类可以使用Objective-C对象的指针作为数据成员,Objective-C类也可以有C++对象指针做实例变量。下例说明了这一点。
    注意:Xcode需要源文件以”.mm”为扩展名,这样才能启动编译器的Objective-C++扩展。
    复制代码
    /* Hello.mm
    * Compile with: g++ -x objective-c++ -framework Foundation Hello.mm -o hello
    */
    #import

    展开全文
  • iOS开发 图文混编

    2016-08-27 21:06:06
    图文混排3种方式  1.webView   优点:简单   缺点:交互比较差,性能差  2.textkit (使用方便)  oc ,coretext  3.coretext(C语言)   优点:性能好 ...#import "Vie

    图文混排3种方式

        1.webView

        优点:简单

        缺点:交互比较差,性能差

        2.textkit (使用方便)

        oc ,coretext

        3.coretext(C语言)

        优点:性能好

        缺点:使用相当复杂


    viewController.m

    <span style="font-size:14px;">#import "ViewController.h"
    #import "TextKit.h"
    #import "TextAttachs.h"
    
    @interface ViewController () <UITextViewDelegate>
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        
        [self setUpTextKit];
    
    }
    
    -(void)setUpTextKit{
        
        TextKit *textkit = [[TextKit alloc] initWithFrame:CGRectMake(0, 0, 200, 50)];
        textkit.center = self.view.center;
        textkit.text = @"hello everyone";
        textkit.backgroundColor = [UIColor grayColor];
        [self.view addSubview:textkit];
        
        UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(50, 50, 300, 60)];
        NSString *textStr= @"想要做自己喜欢做的事情,就必须先把不喜欢事情做好";
        // NSAttributedString 可以设置颜色,字体 背景..
        NSMutableAttributedString *attribute = [[NSMutableAttributedString alloc] initWithString:textStr];
        NSString *str = @"自己";
        
        NSRange range = [textStr rangeOfString:str];
        // 添加属性
        [attribute addAttribute:NSFontAttributeName value:[UIFont systemFontOfSize:20] range:range];
        // 添加颜色
        [attribute addAttribute:NSForegroundColorAttributeName value:[UIColor cyanColor] range:range];
        // 设置链接
        NSString *str1 = @"必须";
        NSRange range1 = [textStr rangeOfString:str1];
        NSURL *url = [NSURL URLWithString:@"http://www.baidu.com"];
        [attribute addAttribute:NSLinkAttributeName value:url range:range1];
        
        // 设置链接的颜色
        textView.linkTextAttributes = @{
                                        NSForegroundColorAttributeName:[UIColor greenColor]
                                       };
        // 编辑状态
        textView.editable = NO;
        textView.delegate =self;
    
        //添加图片附件
        TextAttachs *imageAttachs = [[TextAttachs alloc] init];
        imageAttachs.image = [UIImage imageNamed:@"6.jpg"];
        // 设置属性
        NSAttributedString *attr = [NSAttributedString attributedStringWithAttachment:imageAttachs];
        [attribute insertAttributedString:attr atIndex:6];
        
        textView.attributedText = attribute;
    
    }
    
    #pragma mark - UITextView代理方法
    - (BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange{
        
        return NO;
    }
    
    -(BOOL)textView:(UITextView *)textView shouldInteractWithTextAttachment:(NSTextAttachment *)textAttachment inRange:(NSRange)characterRange{
        
        return YES;
    }
    </span>


    <span style="font-size:14px;">#import "TextAttachs.h"
    
    @implementation TextAttachs
    
    -(CGRect)attachmentBoundsForTextContainer:(NSTextContainer *)textContainer proposedLineFragment:(CGRect)lineFrag glyphPosition:(CGPoint)position characterIndex:(NSUInteger)charIndex{
        
        return CGRectMake(0, 0, 60, 60);
    }
    </span>


    展开全文
  • iOS h5与原生态混编

    千次阅读 2017-10-20 16:52:44
    h5与原生态混编,一般情况下是在VC中插入一个webview,在webview(网上第三方比较好的WKWebView网页视图)中加载h5的地址url,使用的功能大部分主要分为: 1、原生oc调用js  在网页加载完成之后,在成功回调方法...

    h5与原生态混编,一般情况下是在VC中插入一个webview,在webview(网上第三方比较好的WKWebView网页视图)中加载h5的地址url,使用的功能大部分主要分为:

    1、原生oc调用js 

    在网页加载完成之后,在成功回调方法中:

    - (void)webViewDidFinishLoad:(UIWebView *)webView{
        NSString *jsStr = [NSString stringWithFormat:@"showAlert('%@')",@"在JS中Alert弹出的message"];
        [_webView stringByEvaluatingJavaScriptFromString:jsStr];
    }
    或者用JavaScriptCore库

    - (void)webViewDidFinishLoad:(UIWebView *)webView{
        JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
        NSString *textJS = @"showAlert('在JS中Alert弹出的message')";
        [context evaluateScript:textJS];
    }

    2、js调用原生oc 

    使用JavaScriptCore库

    - (void)webViewDidFinishLoad:(UIWebView *)webView{
        JSContext *context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
        context[@"js_share"] = ^{
            NSArray *arg = [JSContext currentArguments];
            if(arg && arg.count){
                JSValue *value = arg[0];
                NSString *string = value.toString;
                NSData *data = [string dataUsingEncoding:NSUTF8StringEncoding];
                NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableLeaves error:nil];
                [self shareButtonAction:dict];
            }
        };
    }


     3、原生oc通过代理监听url

    - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType{
        NSLog(@"%@", request.URL);
        if([request.URL.absoluteString hasSuffix:@"/login"]){
            LoginViewController *vc = [CommonMethod getVCFromNib:[LoginViewController class]];
            [self.navigationController pushViewController:vc animated:YES];
            [self.webView reload];
            return NO;
        }
    }

    最后如何清除webview的缓存

    //清除cookie
    NSHTTPCookie *cookie;
    NSHTTPCookieStorage *storage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
    for (cookie in [storage cookies]){
        [storage deleteCookie:cookie];
    }
    
    //清除UIWebView的缓存
    [[NSURLCache sharedURLCache] removeAllCachedResponses];
    NSURLCache * cache = [NSURLCache sharedURLCache];
    [cache removeAllCachedResponses];
    [cache setDiskCapacity:0];
    [cache setMemoryCapacity:0];


    展开全文
  • iOS和H5的混编(交互)

    千次阅读 2018-10-27 16:34:12
    说道iOS和H5的混编,其实就是OC(swift)和JS相互调用方法,实现点击H5页面上的button,执行iOS原生方法,或者是点击iOS的按钮,执行JS方法,话不多说,直接重点! 1、iOS调用JS方法 在iOS中,html页面是通过...
  • flutter和ios混编

    2019-11-09 14:25:23
    1、xcode创建项目 2、安装cocoapods 3、项目命令行下执行pod init 4、项目命令行下执行pod install 5、用wordspace重新打开项目 6、podfile文件里添加一下代码 ...flutter_application_path = '../flutter_module/...
  • iOS混编代码

    2019-06-18 17:50:07
    本工具用于应对苹果对重复应用的审核(Guideline 4.3 Design Spam),避免苹果机审检测概率。...大神YuYang增加功能的第二个版本:https://github.com/JourneyYoung/iOSMixProject 使用方法: 1.Xcode -> ...
  • 本次分享的内容是:混编后如何针对flutter部分的代码进行restart/reload 操作以及调试代码。flutter支持热重载,我们如果进行过纯flutter开发,就知道flutter的restart/reload 是非常方便的。 re...
  • 因为来饿厂以后做的项目是全公司唯一一个 Swift/OC 混编iOS 项目,所以一路上踩坑无数,现在把一些踩坑的过程和经验总结起来,供大家参考。相信在浏览本文,一定会有所收获。我来的时候项目已经开始 Swift 改造...
  • 而网上大部分都是讲安卓和flutter混编的经验,有iOS和flutter混编的也是比较老的方法,现在已经不再适用,这两天尝试了一下最新的方式,记录一下,希望大家少走弯路。 正题: 以下内容都是按照官方给出的方案进行.....
  • Flutter iOS混编踩坑记

    千次阅读 2019-06-12 07:29:11
    最近开始在项目的边缘模块中尝试使用Flutter开发,对混编过程中遇到的问题做了一些记录。 1、使用了cocoapods 在Debug.xcconfig和Release.xcconfig里面添加 注意FlutterMixed 是自己iOS项目的名称 #include "Pods/...
  • 有问题去官网,最正宗的解释 今天有个小伙伴问我,导入识别不出Switf.h 文件,build setting 也查看了,是正确的.引入文件就是找不到,搞了老一会了. 后来远程给看了一下他的项目, 检查配置文件,build setting 自动生成...
  • OC与C++混编,compile sources as 改成objective-c++,混编C++的SDK就会没问题,但是一些第三方库就会报无法匹配OC函数的错误,用默认的according to file type,在.h文件中 #include <string> 就会报错 'string' ...
  • iOS Objective-C和C、C++混编,最简单的办法是直接将要调用C、C++代码的.m文件改成.mm文件。 1、Objective-C和C混编,如果C方法写在.m文件内部,我们直接调用即可。 #import "ViewController.h" @interface ...
  • 前言 一个RN项目不可能全部都是RN...RN与原生(ios)的目录结构,以及基本三方插件安装等集成。其实很简单,照着教程做就可以了,前提是有一个好的教程。没有一个系统的好教程,靠自己琢磨真的很费劲。有很多坑。特...
  • 最近做的项目导入环信平台在编译时报下面的错误 Undefined symbols for architecture i386:  "_fwrite$UNIX2003", referenced from:  _hex_dump_internal in libEaseMobClientSDK.a(dump.o) ...
  • iOS中MRC和ARC混编

    千次阅读 2015-07-09 23:56:17
    1. 在targets的build phases选项下Compile Sources下选择,不使用arc编译的文件,双击它,输入 -fno-objc-arc 即可(这个类就可以使用MRC模式) 2.  MRC工程中也可以使用ARC的类。方法如下: ...
  • 前言 hihi,勇敢的小伙伴儿们大家好,我们有一个项目许久未更新了,所以代码有很长一段时间没有运行过,这两天想参考原项目的功能...因为项目是混编的原因,Swift的使用直接导致了这次错误的出现。 问题出现及解决...
  • IOS 混编C 报file not found的问题处理

    千次阅读 2018-01-04 12:23:37
    https://stackoverflow.com/questions/10405153/include-string-file-not-found-in-ios-in-c-filexcode 编译.m文件使用 C compiler (clang or llvm-gcc)编译器, 而编译.mm时使用clang++ 或llvm-g++编译器。例如...
  • 在OC和Swift混编的过程中有很多的细节需要注意。 今天介绍一下在OC文件中声明了一个枚举类型,如何在Swift文件中调用该枚举类型的值。 1.项目工程构建的时候选的是Swift语言,项目名称TestProject。 2.建立一个...

空空如也

1 2 3 4 5 ... 20
收藏数 7,648
精华内容 3,059
关键字:

ios混编