Swift 指针

本贴最后更新于 1602 天前,其中的信息可能已经时移世异

总得说点什么,不能只贴代码呐

/// Swift里面也有专门的指针类型,这些都被定性为 `Unsafe`(不安全的), 常见的4种类型
/// UnsafePointer<Pointee> 类似于 const Pointee *
/// UnsafeMutablePointer<Pointee> 类似于  Pointee *
/// UnsafeRawPointer 类似于 const void * 指向类型不确定
/// UnsafeMutableRawPointer 类似于 void * 指向类型不确定

var age = 10
func test1(_ ptr: UnsafeMutablePointer<Int>) {// int *
    ptr.pointee = 20
}

func test2(_ ptr: UnsafePointer<Int>) { // const int *
    print("test2", ptr.pointee)
}

func test3(_ ptr: UnsafeRawPointer) { // const void *
    print("test3", ptr.load(as: Int.self))
}

func test4(_ ptr: UnsafeMutableRawPointer) { // void *
    ptr.storeBytes(of: 30, as: Int.self)
}

//func test3(_ num: inout Int) {
//
//}

test1(&age)
test2(&age)
test3(&age)
test4(&age)
//test3(&age)
print(age)

/// 使用场景
/// OC -> BOOL *
/// Swift -> UnsafeMutablePointer<ObjeCBool>
var arr = NSArray(objects: 11, 22, 33, 44)
arr.enumerateObjects { (element, idx, stop) in
    if idx == 2 {
        stop.pointee = true
    }
    print(idx, element)
}

/// 获得指向某个变量的指针
/// withUnsafePointer body返回类型一样
var ptrAge1 = withUnsafePointer(to: &age){ $0 }
print(ptrAge1.pointee)
var ptrAge2 = withUnsafeMutablePointer(to: &age) { (pointer) -> UnsafeMutablePointer<Int> in
    return pointer
}
var ptrAge3 = withUnsafePointer(to: &age, { UnsafeRawPointer($0) })
var ptrAge4 = withUnsafeMutablePointer(to: &age, { UnsafeMutableRawPointer($0) })
ptrAge4.storeBytes(of: 40, as: Int.self)
print(age)

/// 获取指向堆空间的指针
class Person {
    var age = 0
    deinit {
        print("Person deinit")
    }
}
var person = Person()
var ptrPerson1 = withUnsafePointer(to: &person, { $0 }) //保存person对象的地址值
print(ptrPerson1.pointee.age)

/// 创建指针
var mPtr = malloc(16)
mPtr?.storeBytes(of: 11, as: Int.self)
mPtr?.storeBytes(of: 22, toByteOffset: 8, as: Int.self)
print(mPtr?.load(as: Int.self))
print(mPtr?.load(fromByteOffset: 8, as: Int.self))
free(mPtr)

var allPtr = UnsafeMutableRawPointer.allocate(byteCount: 16, alignment: 1)
allPtr.storeBytes(of: 11, as: Int.self)
allPtr.storeBytes(of: 22, toByteOffset: 8, as: Int.self)
allPtr.advanced(by: 8) //移动8个字节,返回一个新指针
allPtr.deallocate()

var capPtr = UnsafeMutablePointer<Int>.allocate(capacity: 3)
capPtr.initialize(to: 11)
capPtr.successor().initialize(to: 22)
capPtr.successor().successor().initialize(to: 33)
print(capPtr.pointee)
print((capPtr + 1).pointee)
print((capPtr + 2).pointee)

print(capPtr[0])
print(capPtr[1])
print(capPtr[2])
capPtr.deinitialize(count: 3)
capPtr.deallocate()


var pPtr = UnsafeMutablePointer<Person>.allocate(capacity: 3)
pPtr.initialize(to: Person())
(pPtr + 1).initialize(to: Person())
(pPtr + 2).initialize(to: Person())
pPtr.deinitialize(count: 3)
pPtr.deallocate()

--EOF--

  • Swift

    Swift 是苹果于 2014 年 WWDC(苹果开发者大会)发布的开发语言,可与 Objective-C 共同运行于 Mac OS 和 iOS 平台,用于搭建基于苹果平台的应用程序。

    34 引用 • 37 回帖 • 497 关注

相关帖子

3 回帖

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...

推荐标签 标签

  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖
  • Oracle

    Oracle(甲骨文)公司,全称甲骨文股份有限公司(甲骨文软件系统有限公司),是全球最大的企业级软件公司,总部位于美国加利福尼亚州的红木滩。1989 年正式进入中国市场。2013 年,甲骨文已超越 IBM,成为继 Microsoft 后全球第二大软件公司。

    103 引用 • 126 回帖 • 448 关注
  • QQ

    1999 年 2 月腾讯正式推出“腾讯 QQ”,在线用户由 1999 年的 2 人(马化腾和张志东)到现在已经发展到上亿用户了,在线人数超过一亿,是目前使用最广泛的聊天软件之一。

    45 引用 • 557 回帖 • 222 关注
  • OpenResty

    OpenResty 是一个基于 NGINX 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。

    17 引用 • 35 关注
  • CSDN

    CSDN (Chinese Software Developer Network) 创立于 1999 年,是中国的 IT 社区和服务平台,为中国的软件开发者和 IT 从业者提供知识传播、职业发展、软件开发等全生命周期服务,满足他们在职业发展中学习及共享知识和信息、建立职业发展社交圈、通过软件开发实现技术商业化等刚性需求。

    14 引用 • 155 回帖
  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    284 引用 • 247 回帖 • 178 关注
  • Vue.js

    Vue.js(读音 /vju ː/,类似于 view)是一个构建数据驱动的 Web 界面库。Vue.js 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件。

    261 引用 • 662 回帖
  • Laravel

    Laravel 是一套简洁、优雅的 PHP Web 开发框架。它采用 MVC 设计,是一款崇尚开发效率的全栈框架。

    19 引用 • 23 回帖 • 684 关注
  • BAE

    百度应用引擎(Baidu App Engine)提供了 PHP、Java、Python 的执行环境,以及云存储、消息服务、云数据库等全面的云服务。它可以让开发者实现自动地部署和管理应用,并且提供动态扩容和负载均衡的运行环境,让开发者不用考虑高成本的运维工作,只需专注于业务逻辑,大大降低了开发者学习和迁移的成本。

    19 引用 • 75 回帖 • 619 关注
  • B3log

    B3log 是一个开源组织,名字来源于“Bulletin Board Blog”缩写,目标是将独立博客与论坛结合,形成一种新的网络社区体验,详细请看 B3log 构思。目前 B3log 已经开源了多款产品:SymSoloVditor思源笔记

    1083 引用 • 3461 回帖 • 286 关注
  • BookxNote

    BookxNote 是一款全新的电子书学习工具,助力您的学习与思考,让您的大脑更高效的记忆。

    笔记整理交给我,一心只读圣贤书。

    1 引用 • 1 回帖
  • 音乐

    你听到信仰的声音了么?

    59 引用 • 509 回帖
  • Latke

    Latke 是一款以 JSON 为主的 Java Web 框架。

    70 引用 • 532 回帖 • 712 关注
  • 小说

    小说是以刻画人物形象为中心,通过完整的故事情节和环境描写来反映社会生活的文学体裁。

    28 引用 • 108 回帖
  • 30Seconds

    📙 前端知识精选集,包含 HTML、CSS、JavaScript、React、Node、安全等方面,每天仅需 30 秒。

    • 精选常见面试题,帮助您准备下一次面试
    • 精选常见交互,帮助您拥有简洁酷炫的站点
    • 精选有用的 React 片段,帮助你获取最佳实践
    • 精选常见代码集,帮助您提高打码效率
    • 整理前端界的最新资讯,邀您一同探索新世界
    488 引用 • 383 回帖 • 1 关注
  • Ruby

    Ruby 是一种开源的面向对象程序设计的服务器端脚本语言,在 20 世纪 90 年代中期由日本的松本行弘(まつもとゆきひろ/Yukihiro Matsumoto)设计并开发。在 Ruby 社区,松本也被称为马茨(Matz)。

    7 引用 • 31 回帖 • 177 关注
  • 区块链

    区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。所谓共识机制是区块链系统中实现不同节点之间建立信任、获取权益的数学算法 。

    91 引用 • 751 回帖
  • 安装

    你若安好,便是晴天。

    128 引用 • 1184 回帖
  • Kubernetes

    Kubernetes 是 Google 开源的一个容器编排引擎,它支持自动化部署、大规模可伸缩、应用容器化管理。

    108 引用 • 54 回帖
  • 脑图

    脑图又叫思维导图,是表达发散性思维的有效图形思维工具 ,它简单却又很有效,是一种实用性的思维工具。

    21 引用 • 58 回帖
  • MyBatis

    MyBatis 本是 Apache 软件基金会 的一个开源项目 iBatis,2010 年这个项目由 Apache 软件基金会迁移到了 google code,并且改名为 MyBatis ,2013 年 11 月再次迁移到了 GitHub。

    170 引用 • 414 回帖 • 430 关注
  • 京东

    京东是中国最大的自营式电商企业,2015 年第一季度在中国自营式 B2C 电商市场的占有率为 56.3%。2014 年 5 月,京东在美国纳斯达克证券交易所正式挂牌上市(股票代码:JD),是中国第一个成功赴美上市的大型综合型电商平台,与腾讯、百度等中国互联网巨头共同跻身全球前十大互联网公司排行榜。

    14 引用 • 102 回帖 • 403 关注
  • gRpc
    10 引用 • 8 回帖 • 54 关注
  • CSS

    CSS(Cascading Style Sheet)“层叠样式表”是用于控制网页样式并允许将样式信息与网页内容分离的一种标记性语言。

    180 引用 • 447 回帖
  • Sym

    Sym 是一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)系统平台。

    下一代的社区系统,为未来而构建

    523 引用 • 4581 回帖 • 691 关注
  • Kotlin

    Kotlin 是一种在 Java 虚拟机上运行的静态类型编程语言,由 JetBrains 设计开发并开源。Kotlin 可以编译成 Java 字节码,也可以编译成 JavaScript,方便在没有 JVM 的设备上运行。在 Google I/O 2017 中,Google 宣布 Kotlin 成为 Android 官方开发语言。

    19 引用 • 33 回帖 • 28 关注
  • 单点登录

    单点登录(Single Sign On)是目前比较流行的企业业务整合的解决方案之一。SSO 的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

    9 引用 • 25 回帖 • 2 关注