oc swift 中编译_oc和swift混编导致编译速度很慢 - CSDN
  • 1.由于接触的swfit一些教程,所以准备在已有的OC里面使用swift,按照教程,没问题,但是我在原来的OC中使用swift,怎么也编译不通过, 开始的时候报错,提示找不到各种类,后来仔细发现,原来不可以在同一个项目...

    最近在学习swift,很想在之前OC的项目中使用swift

    开始的时候,上手还算比较快,下面记录下简单的一些坑。

    1.由于接触的swfit一些教程,所以准备在已有的OC里面使用swift,按照教程,没问题,但是我在原来的OC中使用swift,怎么也编译不通过,

    开始的时候报错,提示找不到各种类,后来仔细发现,原来不可以在同一个项目中即在oc代码中使用swfit代码,并且在swift代码中使用OC,类似于死循环的感觉

    需要先编译出项目名-swift.h才可以。

    2.原来的OC在转化方法的时候,主要类型是否需要加!,不然也经常报错

    3.在用swift使用xib的时候,总会莫名奇妙的 nsscanner nil 错误,目前还未找到原因,而且在使用scrollview的时候更多。暂时记录后续再找原因

    展开全文
  • 编译型语言,就是在其执行过程需要先将其经过编译成机器码来给计算机识别的,其执行效率就会比较高这个是显而易见的,常见比如:C、C++ 而解释型语言,是不用编译这个过程的,只是在执行时通过相应的翻译器...

    首先需要明确的一点是,什么是编译型语言和解释性语言

    编译型语言,就是在其执行过程中需要先将其经过编译成机器码来给计算机识别的,其执行效率就会比较高这个是显而易见的,常见比如:C、C++

    而解释型语言,是不用编译这个过程的,只是在执行时通过相应的翻译器(虚拟机)逐行翻译。这样它的跨平台性就会较好,因为可以直接通过编译器编译成需要的平台上的语言,但是有一个问题就是:它每次运行都要讲每行代码逐行解释翻译一遍。常见比如:Python、JS、PHP

    由此可见,我们的OC和Swift都是需要先进行编译后才能执行代码功能的,因此他们都是编译型语言。


    接着谈的就是OC和swift的其中一个不同,那就是Swift它是一个动态类型语言,意思是他是在代码执行时才去做数据类型的检查,使用了swift的童鞋应该都清除,swift中变量的类型声明都是使用Var关键字的并不指定具体数据结构类型,这又衍生出一个类型,那就是弱类型语言,这个很好理解,类型比较弱嘛就是没有强制规定。相对应的OC中变量的在声明时候都要指定其类型,因此它就是相对动态类型语言反面的静态类型语言,也是强类型语言

    最后还要说明的就是运行时语言,由上文提到:编译型语言是要经过 编译--》运行,运行时语言就是在程序运行的时候才去调用该对象的方法,和决定其数据类型。而不是在编译的时候进行

    不知道这样讲,能不能清楚些,

    欢迎辛辣点评

    展开全文
  • 2. 在swiftOC混编的编译环境下, oc类不能访问swift创建类的代理? 解决方法如下: 在代理的头部加上 @objc(代理名字),这样就在外部就可以访问了,如下图。 然后就和oc中的代理一样,写上协议方法...


    1. swift与oc混编译具体怎么实现,这儿我就不重复讲出了,网上有大把的人讲解。

    2. 在swift与OC混编的编译环境下, oc类不能访问swift创建类中的代理?

    解决方法如下:



    在代理的头部加上 @objc(代理名字),这样就在外部就可以访问了,如下图。 然后就和oc中的代理一样,写上协议方法,就可以进行你想要的操作了。



    3. swift中的回调方法介绍:

       1. 通过代理 ,写法大家可以看上面的两张图片,和oc代理差不多。

       2. 通过闭包来实现oc中代码块(Block)的方法,来进行代码回调

           2.1 定义  (swift类)

          

          2.2 调用   (swift类)

        

         2.3 具体回调处:(OC - 类)

         


    本文持续更新, 看oc与swift 混编有哪些雷,需要我们踩

    展开全文
  • oc调用swift

    2015-11-14 18:05:06
    如果你想在Objective-C工程,嵌入Swift文件,实现OC调用Swift,那么这篇文章就能帮助你,由于本人最近在开发Swift项目,所以实现过OC调用Swift,在这过程遇到过一些瓶颈,特此,将此文奉上,供大家参考。...

    OC调用Swift


    如果你想在Objective-C工程中,嵌入Swift文件,实现OC调用Swift,那么这篇文章就能帮助你,由于本人最近在开发Swift项目,所以实现过OC调用Swift,在这过程中遇到过一些瓶颈,特此,将此文奉上,供大家参考。

    OC调用Swift文件,需要创建桥接头文件,这个文件是当你在OC开发环境中创建Swift文件时由Xcode生成,该桥接头文件的命名是:<工程名>-Bridging-Header.h,它的作用是实现OC和Swift文件混编,并且如果我们想在当前OC类中调用Swift文件,必须在当前OC类中包含头文件,它的命名是:<工程名>-Swift.h,该头文件是由Xcode本身去维护,当我们点击进入到该头文件时,会看到Swift文件被编译成了OC封装的接口。

    下面让我们来通过一个小Demo,进一步了解如何实现OC调用Swift。


    第一步:创建OC工程

    启动Xcode 7.1,然后单击File→New→Project菜单,在打开的Choose atemplate for your new project界面中选择“iOS →Application→Single View Application”工程模板(如下图所示)。


    选中Single View Application单击“Next”,会出现如下图所示



    这里我们将工程名命名为OCCallSwift,单击“Next”,就会出现下图所示的界面


    单击“Create”,这时我们的OC工程就创建好了。

    接下来我们创建一个OC的类,类名为OCViewController,具体怎么创建就不详细说了。


    第二步:在OC工程中添加Swift文件


    在当前OC工程中,创建Swift文件,如下图所示:


    选中Cocoa Touch Class,点击“Next”,此时会跳到下图:


    这里我们将Swift文件命名为SwiftViewController,将Language设置为Swift,单击“Next”,跳到下图:


    这时单击“Creat”,就会弹出“Would you like to configure an Objective-C bridging header?”,如下图所示


    单击“Create Bridging Header”,这时我们就在OC工程中创建好了一个Swift文件,如下图所示



    第三步:实现OC调用Swift

    这里我们就简单实现一下在OC类中跳转到Swift文件中

    1)在OC类中包含头文件

    #import <OCCallSwift-Swift.h>,命名规则为:<工程名>-Swift.h,如下图所示


    2)在OC类中调用Swift文件,跟OC类调用OC类实现方式一样,如下图所示:



    这样我们就实现了OC调用Swift。


    友情提示:1.以上的代码是在Xcode7.1中实现,并且是新工程;

    2.必须创建桥接头文件(“Create Bridging Header);

    3.必须在调用Swift文件的OC类中包含如下头文件:<工程名>-Swift.h

    4.如果以上条件全部符合,但是你在一个老的OC应用中调用Swift,有可能出现下面情况'<工程名>.Swift' file not found,这时你就应该在Xcode中的Build Setting中找到"Defines module",将其改为Yes


    特别说明:1. 以上Swift文件均指Swift类;

      2. Swift语言为Swift2.0版本。


    著作权声明:本文为原创,欢迎转载分享。请尊重作者劳动,转载时保留该声明和作者博客链接,谢谢

    展开全文
  • 、、、、、首先尝试次方发,看起来很有效 背景 随着 Xcode8 和 swift3.0 的正式到来,...)但是,转到swift3只会,在用Xcode8编译,发现编译过程变得非常慢,哪怕打一个空格,都要重新编译很久。于是在网上

    、、、、、首先尝试次方发,看起来很有效

    背景

    随着 Xcode8 和 swift3.0 的正式到来,我开始着手将 swift2.3 的项目转到 swift3 (至于转换过程,这里不多做介绍,Xcode自带的转换工具,基本可以转换80%左右,剩下的自己慢慢调试即可。)但是,转到swift3只会,在用Xcode8编译,发现编译过程变得非常慢,哪怕打一个空格,都要重新编译很久。于是在网上查找解决办法,查找了半天各种方法全用,发现于事无补。 

    有什么加一个 HEADERMAP_USES_VFS = YES () 这是地址,反正这个对我没用,感兴趣的话自己试试

    针对这种情况,我就自己探索,出发点是排查哪些文件,哪些方法导致编译变慢?

    探索Xcode编译,在哪些地方可以看到编译文件过程

    通过多次编译查看,发现在Xcode左边栏,最后一个选项,是每次的编译运行等记录, 每行记录中都会有每次编译的文件编译记录。如下图

    再次查看正在编译的一条记录(正在编译的记录后面有一个转圈圈的”菊花“),发现有图中1、2两种标识, 一个绿色:white_check_mark:说明,这是编译完成了,另一个是灰色→箭头,说明是正在编译;此时发现灰色一直停留在这里,指向图中的文件,左边的菊花一直转个不停, 编译卡住了。这样一来就找到编译是什么文件导致的那么慢。

    排查文件中哪些代码导致的编译卡住?

    排查的方法,采用比较笨的方法,暴力注释方法: 就是注释找到卡住的文件中的所有方法里的代码,不要注释方法,再次编译,此时发现该文件很快通过编译,然后在依次解开部分方法注释,再次编译,直到发现解开某个方法的注释后,编译再次卡住,那就说明那个方法中的代码写的有问题,然后在依次注释,解开注释,排查方法中的某一行代码的问题。 经过一番排查,我找到了我代码中卡住的部分代码,如下图红色圈中的代码 

    在字典中的key对应的value,没有给直接的值,而是给出一个表达式,这样会导致Xcode8的编译速度极其慢,不知道为什么会出现这样的问题,之前的Xcode版本是没有的。

    找到问题所在,解决问题就简单了,于是修改代码如下图:

    修改之后,再次编译,重新回到了快速编译的时代了,再也不用等上5-10分钟不等了。

    以上过程,是针对我遇到的问题而言的,不知道是否存在普遍性,如若你也遇到,刚好看了我的文章,也解决了问题,那就会心一笑吧,如若你也遇到了,但是没有解决问题,也请你会心一笑吧。

    这是苹果开发者提到的Xcode8编译超慢的问题,我看了下,也做了对应修改,发现对我并没有什么用, 感兴趣的话进去看看吧

    有时候自己慢慢去探索出问题的所在,也是很不错的体验。



    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

    XCode默认使用与CPU核数相同的线程来进行编译,但由于编译过程中的IO操作往往比CPU运算要多,因此适当的提升线程数可以在一定程度上加快编译速度。
    2. 将Debug Information Format改为DWARF
    在工程对应Target的Build Settings中,找到Debug Information Format这一项,将Debug时的DWARF with dSYM file改为DWARF。
    这一项设置的是是否将调试信息加入到可执行文件中,改为DWARF后,如果程序崩溃,将无法输出崩溃位置对应的函数堆栈,但由于Debug模式下可以在XCode中查看调试信息,所以改为DWARF影响并不大。这一项更改完之后,可

    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、

    一,非代码层面的检查和优化



    、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、


    前言


    Swift作为一个新兴的语言,有着苹果Dad(dy???)的支持与良好的社区环境。于是乎大家都开始慢慢尝试在项目中使用Swift。在我们的项目中就有大量的Swift,但是过慢的编译时间真的是killing us。 完整的编译一次可能需要15到20分钟,完全不能忍。

    先说结果,在我的电脑MacPro上,项目编译时间直接从以前20m41s缩短了10m16s
    而这10分钟仅仅只是从的代码层面带来的效果

    定位问题


    国外友人Robert已经为我们写好了一个Swift编译时间定位的工具【请戳这里】。 方便好用,可以立竿见影的找到问题代码。

    ps:以前也用XCTOOL但是xocde8已经不再支持build了,非常可惜。

    代码优化


    指定类型与拒绝泛型

    原码:

    var model : UILabel?
    var cat : String?
    var name : String?
    var number : Int?
    //build tiem : 8740.3ms
    func sendData() {
        let parameter = ["model" : model?.text ?? "",
                         "cat" : cat ?? "",
                         "name" : name ?? "",
                         "number" : number ?? 0,
                         "dog" : "dog"]
        print("send request with parameter:\(parameter)")
    }

    这段代码所需要的编译时间是8740.3ms,就这么一个字典定义,我们竟然浪费了8秒!

    指定类型之后我们再来看看

    //build time: 3235.4ms
    let parameter : [String : AnyObject] = ["model" : model?.text ?? "",
                                   "cat" : cat ?? "",
                                   "name" : name ?? "",
                                   "number" : number ?? 0,
                                   "dog" : "dog"]

    这次所需要的编译时间就已经缩短为了3235.4ms,通过手动指定类型,我们缩短了5s以上的时间让费

    再紧接,我们继续观察,这个parameter的字典其实可以全部为String,根本用不到AnyObject。

    指定特定的类型

    //build time: 200.3ms
    let parameter : [String : String] = ["model" : model?.text ?? "",
                        "cat" : cat ?? "",
                        "name" : name ?? "",
                        "number" : "\(number ?? 0)",
                        "dog" : "dog"]

    这次所需要的编译时间就已经缩短为了200.3ms,把AnyObject ->String ,我们缩短了2s以上的时间让费!!

    所以如果你可以一种类型搞定,请千万别写AnyObject!!!

    通过指定正确的类型我们从8740ms的编译时间缩短到了200ms!!!!

    运算时nil保护抽离

    //build time : 9804ms
    func calculateSize(view : UIView?) -> CGSize{
        return CGSize(width: 10 + (view?.bounds.width ?? 0) + (view?.bounds.height ?? 0) + 22, height: 20)
    }
    
    //build time : 172ms
    func calculateSize(view : UIView?) -> CGSize{
        let width = view?.bounds.width ?? 0
        let height = view?.bounds.height ?? 0
        return CGSize(width: 10 + width + height + 22, height: 20)
    }

    这段代码编译了9804ms,只是因为我们在运算的时候一并加入nil的保护。如果我们拆离nil保护,编译时间缩短了98.3%

    • 使用三目运算(Bool ? a : b)时也非常耗时,但还没有到非常严重的程度,一个三目可能需要额外的 100ms 到 200ms编译时间
    • 当你在字典中使用nil保护时,也可能造成极长的编译时间,有时候甚至会长达20s.但不是每次都出现。我理项目时就通过BuildTimeAnalyzer发现了很多这样的问题。比如:["model" : model?.text ?? ""]. 在通过把他们强制转化成想要的类型String后得到解决:["model" : (model?.text ?? "")as String]。 暂时还不知道为什么。 猜测是因为 model?.text 的text属性是一个可选型, compiler花费了很长的时间来确定到底是Optional(String)还是String.但又不是每次都出现,非常奇怪。

    少用++=运算符

    //build time 1400.6ms
    func arrPlusOperatos() {
        let arr1 = [1,2,3]
        let arr2 = [3,4,5]
        result += arr1 + arr2 + [10]
    }
    //build time 8.6ms
    func arrPlusOperatos() {
        let arr1 = [1,2,3]
        let arr2 = [3,4,5]
        result.appendContentsOf(arr1)
        result.appendContentsOf(arr2)
        result.appendContentsOf([10])
    }

    尽量少的使用++=号来合并参数, 在项目中有一些array的合并编译时间高达5000ms.

    对于String也是一样的,String 使用\(value)来合并值,或API给的append.

    总结


    上面的几个问题是在整理项目(Swift2.3)中,特别明显影响编译速度的点:

    • 指定类型、拒绝泛型
    • 运算时nil保护抽离、少用三目运算
    • 少用+、+=运算符
      缩短了我们接近50%的Swift编译时间。

    具体大家可以用BuildTimeAnalyzer来查看项目哪些func存在严重的编译过长问题。

    更多:

    1. regarding-swift-build-time-optimizations
    2. swift-compiler-performance-tips-and-tricks
    3. why-is-swift-compile-time-so-slow

    后续


    框架上的提高编译性能:

    • 模块化代码,使用私有Cocoapods repository. 让不同模块以Framework或则.a文件的形式在项目里使用。如此每次编译的时候就只需要编译自己模块下的代码。其他模块的代码将会被编译后缓存,不需要重复编译。

    其他一些Xcode优化包括:

    • Find Implicit Dependencies Off [1]
    • Build Active Architecture Only Yes On Debug [2]
    • Precompile Prefix Header set to YES [3]
    • defaults write com.apple.dt.Xcode IDEBuildOperationMaxNumberOfConcurrentCompileTasks 4 [4]
    展开全文
  • OC Swift 混编

    2017-08-30 13:29:01
    首先承认我落后了,到今天才开始在项目里用swift,而且还不是全部的用,只是ocswift混编,因为实在是进入项目的时候框架已经用oc搭好了啊啊啊啊啊。只能退而求其次,混编了,大致根据百度到的方法试了一下,不是很...
  • 今天研究了一下如何在OC项目使用swift文件,即OCswift的混编问题,发现在OC中要使用swift文件也是蛮简单的,实践过程列如下: 1)首先随便创建了一个OC项目,就叫 DetialViewDemo 2)因为Swift的代码默认是...
  • OCSwift混编的三种情况: 1、OC工程写入Swift文件并随手创建桥接文件 2、Swift工程写入OC文件并随手创建桥接文件 3、混编时舍弃创建桥接文件,手动再创建一遍的方法
  • OCswift区别

    2019-04-03 10:07:42
    swift中oc中没有的类 比如 元组 有泛型 3.因为swift 定义的常亮和变量是没有值的,所以引入了可选的概念,这时候 如果swift没有值的话 就用optional 4.在swift ,let 声明的常量的值不能改变 var 生命的变量的...
  • OCSwift混合使用

    2017-07-11 09:13:02
    随着swift趋向于稳定,越来越多的公司启动的新项目也想使用swift过把瘾,使用swift的好处与弊端不再赘述。...OC中引用Swift文件 Swift中引用OC文件,以及第三方库 Xcode8以后编译swift2.x OC引用Swift第三方库
  • ...在OC中使用Swift 1.首先创建一个工程名字就叫做CHWTest1 2.在工程的Build Setting把Defines Module改为YES,如图 3.把Product Name设为工程的名字,如图 4
  • 编译型语言,就是在其执行过程需要先将其经过编译成机器码来给计算机识别的,其执行效率就会比较高这个是显而易见的,常见比如:C、C++ 而解释型语言,是不用编译这个过程的,只是在执行时通过相应的翻译器...
  • OCSwift如何相互调用

    2017-05-23 12:15:55
    文件是自动创建的在swift中调用OC代码使用的桥接文件,需要将在swift中使用的OC的相关头文件添加该此处
  • 场景描述:在OC类的方法,调用Swift类的方法,报错:No visible @interface for ‘CCC’ declares the selector ‘MMM’(CCC为类名,MMM为方法名) // OC中的方法: - (void)test { NSLog(@"hello ...
  •   在OC swift混编后打包由于SwiftSupport支持文件会导致混编后的打的包文件会偏大。 ####解决方法 Build Setting -&gt; User-Defined -&gt; EMBEDDED_CONTENT_CONTAINS_SWIFT 设置为NO #####相关链接 ...
  • OCswift相互调用

    2017-04-26 11:39:33
     在OC项目创建一个swift文件的时候,Xcode 会提示 需要创建一个桥接文件,点确定创建桥接文件,Xcode会自动创建一个桥接文件 名字:工程名-Bridging-Header.h 这个桥接文件是 swift
  • OC项目使用Swift

    2016-02-27 09:23:30
    OC项目使用Swift 本文版权归作者所有,如需转载请联系孟祥月 CSDN博客:http://blog.csdn.net/mengxiangyue 独立博客:http://mengxiangyue.com 最近公司的项目开始计划使用Swift,由于原先的工程都是使用...
  • 背景在上一篇文章简单讲述了怎么创建SwiftOC的混编工程。本篇讲一下SwiftOC的混编工程的方法调用。OC调用SwiftOC调用Swift方法比较简单。但是需要注意以下几点: 1.需要在当前OC类里导入xxx-Swift.h头文件,...
  • SwiftOC 互相调用

    2018-07-20 16:19:07
    Swift 调用 OC 分为两种常见情况,一种是直接在 Application 的 project 使用;另一种情况是,在 framework 开发使用。 对于互相调用的原理,如下图所示,更详细的内容可以参考 《Using Swif with Cocoa and ...
  • iOS oc 调用 swift

    2019-07-03 07:14:24
    如股票oc要调用swift里面的代码 需要包含固定这个头文件 项目名称 LiqunSwiftDemo-Swift.h #ProjectName#-Swift.h 固定的写法 swift 目的 是取代oc 但是 不会完全取代 只是前端的替换 LiqunSwiftDemo-Swift 点...
1 2 3 4 5 ... 20
收藏数 5,053
精华内容 2,021
关键字:

oc swift 中编译