|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
有一些像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[2]对应为(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里有很多这样关于函数命名的约定 |
|