小妖女 发表于 2015-1-18 11:27:52

IOS编程:Swift 与 ObjC 和 C 的交互,第三部分仓酷云

有一些像NSCopying的接口(经@李禹龙提醒应该叫协议)不是特别用到开始不用了解NSObject创建对象的时候用+(id)alloc方法创建后需要init方法初始化媒介

本文办理以下成绩


[*]ObjC/C中界说的某个范例、布局体,经由过程BridgeHeader大概Module对应到Swift究竟是甚么范例
[*]指针间的转换成绩
增补之前没办理的一些成绩,好比提到CMutablePointer的sizeof是两个字长,那末在函数挪用中是怎样对应到C的指针的?
准备内容:


[*]Swift与Objective-C之间的交互
[*]简析Swift和C的交互
[*]简析Swift和C的交互,Part二
[*]SwiftNSErrorInternals(剖析Swift对NSError操纵)
[*]Swift的隐式范例转换
[*]SwiftAttributes
C/ObjCtoSwift对应划定规矩

以下内容均合适Objective-C。第一部分合适C。
forC

可导出的范例界说

函数、列举、布局体、常量界说、宏界说。
布局体界说撑持:
typedefstructName{...}Name;typedefstructName_t{...}Name;structName{...};个中没法处置的布局体、函数范例、varargs界说不导出。估计今后版本会修复。带bitfield的布局体也没法辨认。
范例对应干系

细心剖析发明,诡异情形还良多。基本范例请参考上几篇。
在函数界说参数中:
|范例|对应为
|void*|CMutableVoidPointer
|Type*、Type[]|CMutablePointer<Type>
|constchar*|CString
|constType*|CConstPointer<Type>
|constvoid*|CConstVoidPointer
在函数前往、布局体字段中:
|范例|对应为
|constchar*|CString
|Type*、constType*|UnsafePointer<Type>
|void*、constvoid*|COpaquePointer
|没法辨认的布局指针|COpaquePointer
别的另有以下情形:
全局变量、全局常量(const)、宏界说常量(#define)均利用var,常量不带set。
布局体中的数组,对应为元祖,比方intdata对应为(CInt,CInt),以是大概。。会很长。数组有几元素就是几元祖。
forObjC

ObjC分明情形要好的多,官方文档也很具体。
除NSError**转为NSErrorPointer外,必要注重的就是:
函数参数、前往中的NSString*被交换为String!、NSArray*被交换为AnyObject[]!。
而全局变量、常量的NSString*稳定。
关于CMutablePointer的举动

上回说到CMutablePointer、CConstPointer、CMutableVoidPointer、CConstVoidPointer
四个指针范例的字长是2,也就是说,不成以间接对应为C中的指针。可是后面说范例对应干系的时分,C函数声明转为Swift
时分又用到了这些范例,以是看起来自相冲突。细心剖析了lldb反汇编代码后发明,有以下埋没举动:
inSwift

在纯Swift情况下,函数界说等等、这些范例字长都为2,不会有任何不测情形呈现。
inC/ObjC

当一个函数的声明是由BridgeHeader大概LLVMModule隐式转换而来,且用到了这四个指针范例,那末代码编译过程当中范例转换划定规矩、隐式转换挪用等划定规矩仍然无效。只不外在代码最天生一步,会拔出以下公有函数挪用之一:
@transparentfunc_convertCMutablePointerToUnsafePointer<T>(p:CMutablePointer<T>)->UnsafePointer<T>@transparentfunc_convertCConstPointerToUnsafePointer<T>(p:CConstPointer<T>)->UnsafePointer<T>@transparentfunc_convertCMutableVoidPointerToCOpaquePointer(p:CMutableVoidPointer)->COpaquePointer@transparentfunc_convertCConstVoidPointerToCOpaquePointer(p:CConstVoidPointer)->COpaquePointer这个历程是面前埋没的。然后将转换的了局传参给对应的C/ObjC函数。完成了指针巨细的字长准确分歧。

init指的是所有前面是init的方法比如UIView的初始化方法是-(id)initWithFrame:(CGRect)aRect在Objc里有很多这样关于函数命名的约定

灵魂腐蚀 发表于 2015-1-21 07:23:06

我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。

分手快乐 发表于 2015-1-30 11:01:09

有办法利用自己手头的电脑立刻开始这个美妙旅程的。

愤怒的大鸟 发表于 2015-2-5 05:10:04

在此,某不才愿将安装成功的Mac OS X系统的vmware虚拟机向有志学习iOS开发的各位学友们免费开放出来,经测试,可以在WindowsXP/Win7系统上完美运行,即便你的机器只有2GB内存。

兰色精灵 发表于 2015-2-11 04:44:00

众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。

谁可相欹 发表于 2015-2-11 08:46:27

因为我们老师也是自学的,给我们讲课说的最多的就是百度,谷歌,查文档。

小妖女 发表于 2015-2-11 20:12:32

自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉

admin 发表于 2015-2-17 04:22:04

中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者,

海妖 发表于 2015-3-5 15:46:14

开始的时候甚至想放弃,不过想想自己的未来,只能咬牙坚持,课下就不停的缠着老师。放学就补基础,这些基础的东西没有速成的,只有刻苦努力。我是后来发现的,转变自己的心态,不要读书看资料当成一种痛苦

不帅 发表于 2015-3-5 23:58:11

有办法利用自己手头的电脑立刻开始这个美妙旅程的。

透明 发表于 2015-3-20 00:19:16

重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。

小女巫 发表于 2015-4-4 09:38:30

其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。
页: [1]
查看完整版本: IOS编程:Swift 与 ObjC 和 C 的交互,第三部分仓酷云