Swift和Objective-C混编的那些坑

如何混编不用多说,苹果对Swift 3.0以上的混编辅助已经做得很方便了——无非是build settings中设置标志,以及两个文件,一个是系统或自己创建的bridge文件,用于Swift文件调用OC类导入头文件的桥接;一个是系统生成的xx-swift.h文件,这个连导入都不需要做,直接引用即可。

Swift的以Object为基类的集合类型在传递时可能全部被深拷贝,而OC以NSObject为基类的传递都是默认指针传递。

Swift文件调用OC类的属性时不会编译成可选类型,因此当该OC类的属性为空时,而编译器并不会给出提示,于是运行时Swift代码取值时会崩溃。所以一定要关注调用的OC属性是否可能为nil,并相应做判空处理。

混编后的App如果产生Swift文件内的崩溃,在Bugly上无法生成有效的堆栈,可能会定位到具体的Swift函数,但行数不确定。

个人认为向Swift演进的最大障碍是:由于两种语言混编,并且Swift的ABI不稳定,所以为了兼容所有系统,包括Swift还没有发明时的iOS 7,App打包时会把Swift运行时库全部加入进包中,其中Swift Core, Foundation, Support等动态库有将近30多M,打ipa包时会比纯OC多出10多M;而解压安装到本地后的占用空间更是要多出40,50M。

基本上领导和产品经理们不会放过你的。

更新与更正:经过实践发现,打包成提交App Store的ipa与企业分发的包略有区别,苹果会对Store版本ipa进行合理瘦身,因此这个问题就不再是问题了。夜

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。