仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1370|回复: 11
打印 上一主题 下一主题

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

[复制链接]
小妖女 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:27:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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

可导出的范例界说

函数、列举、布局体、常量界说、宏界说。
布局体界说撑持:
  1. 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隐式转换而来,且用到了这四个指针范例,那末代码编译过程当中范例转换划定规矩、隐式转换挪用等划定规矩仍然无效。只不外在代码最天生一步,会拔出以下公有函数挪用之一:
  1. @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内存。
兰色精灵 该用户已被删除
5#
发表于 2015-2-11 04:44:00 | 只看该作者
众多研发人员积极参与到iOS平台的开发中来也就不足为奇了。
谁可相欹 该用户已被删除
6#
发表于 2015-2-11 08:46:27 | 只看该作者
因为我们老师也是自学的,给我们讲课说的最多的就是百度,谷歌,查文档。
小妖女 该用户已被删除
7#
 楼主| 发表于 2015-2-11 20:12:32 | 只看该作者
自从苹果公司开放iOS SDK以来,大量的国内外的软件开发者将关注的目光聚集在苹果的iOS平台上。由于iPhone和iPad自一出现就给人带来了颠覆性的感觉
admin 该用户已被删除
8#
发表于 2015-2-17 04:22:04 | 只看该作者
中国如今已然发展成为一个软件大国,软件人才的数量跃居全球之首。当然,在苹果平台的开发领域,也保持了相当强劲的发展势头。然而,很多初入iOS开发门槛的开发者,
海妖 该用户已被删除
9#
发表于 2015-3-5 15:46:14 | 只看该作者
开始的时候甚至想放弃,不过想想自己的未来,只能咬牙坚持,课下就不停的缠着老师。放学就补基础,这些基础的东西没有速成的,只有刻苦努力。我是后来发现的,转变自己的心态,不要读书看资料当成一种痛苦
不帅 该用户已被删除
10#
发表于 2015-3-5 23:58:11 | 只看该作者
有办法利用自己手头的电脑立刻开始这个美妙旅程的。
透明 该用户已被删除
11#
发表于 2015-3-20 00:19:16 | 只看该作者
重要的是,放眼全球也的确找不到第二个如苹果iOS平台这样健壮、完整、先进而且为开发者带来真实收益的开发平台来。
小女巫 该用户已被删除
12#
发表于 2015-4-4 09:38:30 | 只看该作者
其实在培训的过程中,学习到最多的就是查资料的方式,当时感觉老师好坑,什么都不告诉我们,让我们自己去查,但是现在觉得还是要自己解决问题,这样才能理解的更加深入。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 18:55

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表