网站大量收购独家精品文档,联系QQ:2885784924

Swift 中的指针使用尽量减少登场几率技术分享.doc

Swift 中的指针使用尽量减少登场几率技术分享.doc

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
文档全是精心选出来的精品资料,绝对值得下载!

PAGE \* MERGEFORMAT PAGE \* MERGEFORMAT 1 Swift 中的指针使用尽量减少登场几率技术分享   Apple 期望在 Swift 中指针能够尽量减少登场几率,因此在 Swift 中指针被映射为了一个泛型类型,并且还比较抽象。这在一定程度上造成了在 Swift 中指针使用的困难,特别是对那些并不熟悉指针,也没有多少指针操作经验的开发者 (包括我自己也是) 来说,在 Swift 中使用指针确实是一个挑战。在这篇文章里,我希望能从最基本的使用开始,总结一下在 Swift 中使用指针的一些常见方式和场景。这篇文章假定你至少知道指针是什么,如果对指针本身的概念不太清楚的话,可以先看看这篇五分钟 C 指针教程 (或者它的中文版本),应该会很有帮助。   初步   在 Swift 中,指针都使用一个特殊的类型来表示,那就是 UnsafePointer。遵循了 Cocoa 的一贯不可变原则,UnsafePointer 也是不可变的。当然对应地,它还有一个可变变体,UnsafeMutablePointer。绝大部分时间里,C 中的指针都会被以这两种类型引入到 Swift 中:C 中 const 修饰的指针对应 UnsafePointer (最常见的应该就是 C 字符串的 const char * 了),而其他可变的指针则对应 UnsafeMutablePointer。除此之外,Swift 中存在表示一组连续数据指针的UnsafeBufferPointer,表示非完整结构的不透明指针 COpaquePointer 等等。另外你可能已经注意到了,能够确定指向内容的指针类型都是泛型的 struct,我们可以通过这个泛型来对指针指向的类型进行约束以提供一定安全性。   对于一个 UnsafePointer 类型,我们可以通过 memory 属性对其进行取值,如果这个指针是可变的UnsafeMutablePointer 类型,我们还可以通过 memory 对它进行赋值。比如我们想要写一个利用指针直接操作内存的计数器的话,可以这么做:   func incrementor(ptr: UnsafeMutablePointer) {   ptr.memory += 1   }   var a = 10   incrementor(a)   a // 11   这里和 C 的指针使用类似,我们通过在变量名前面加上 符号就可以将指向这个变量的指针传递到接受指针作为参数的方法中去。在上面的 incrementor 中我们通过直接操作 memory 属性改变了指针指向的内容。   与这种做法类似的是使用 Swift 的 inout 关键字。我们在将变量传入 inout 参数的函数时,同样也使用 符号表示地址。不过区别是在函数体内部我们不需要处理指针类型,而是可以对参数直接进行操作。   func incrementor1(inout num: Int) {   num += 1   }   var b = 10   incrementor1(b)   b // 11   虽然 在参数传递时表示的意义和 C 中一样,是某个“变量的地址”,但是在 Swift 中我们没有办法直接通过这个符号获取一个 UnsafePointer 的实例。需要注意这一点和 C 有所不同:   // 无法编译   let a = 100   let b = a   指针初始化和内存管理   在 Swift 中不能直接取到现有对象的地址,我们还是可以创建新的 UnsafeMutablePointer 对象。与 Swift 中其他对象的自动内存管理不同,对于指针的管理,是需要我们手动进行内存的申请和释放的。一个UnsafeMutablePointer 的内存有三种可能状态:   内存没有被分配,这意味着这是一个 null 指针,或者是之前已经释放过   内存进行了分配,但是值还没有被初始化   内存进行了分配,并且值已经被初始化   其中只有第三种状态下的指针是可以保证正常使用的。UnsafeMutablePointer 的初始化方法 (init) 完成的都是从其他类型转换到 UnsafeMutablePointer 的工作。我们如果想要新建一个指针,需要做的是使用alloc: 这个类方法。该方法接受一个 num: Int 作为参数,将向系统申请 num 个数的对应泛型类型的内存。下面的代码申请了一个 Int 大小的内存,并返回指向这块内存的指针:   var intPtr = UnsafeMutablePointer.alloc(1)   // UnsafeMutablePointer(0x7FD3A8E00060)   接下来应该做的是对这

您可能关注的文档

文档评论(0)

xcs88858 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档