Swift 里的指针

基础知识
指针的内存状态
| typed? | initiated? |
|---|---|
| ❌ | ❌ |
| ✅ | ❌ |
| ✅ | ✅ |
之前分配的内存可能被释放,使得指针指向了未被分配的内存。
有两种方式可以使得指针指向的内存处于Uninitialized状态:
- 刚刚被分配内存
- 内存被
deinitialized
var bytes: [UInt8] = [39, 77, 111, 111, 102, 33, 39, 0]
let uint8Pointer = UnsafeMutablePointer<UInt8>.allocate(capacity: 8)
此时,uint8Pointer处于Uninitialized状态。
已经被初始化的内存,可以通过pointee属性或者下标方式访问。
let ptr: UnsafePointer<Int> = ...
// ptr.pointee == 23
// ptr[0] == 23
Typed Pointers
| 指向内存能否改动 | 可否进行边界检查 | |
|---|---|---|
| UnsafePointer | ❌ | ❌ |
| UnsafeMutablePointer | ✅ | ❌ |
| UnsafeBufferPointer | ❌ | ✅ |
| UnsafeMutableBufferPointer | ✅ | ✅ |
Raw Pointers
即指向的内存没有特定类型。
Use raw pointers and buffers to access memory for loading and storing as raw bytes.
- automated memory management ❌
- type safety ❌
- alignment guarantees ❌
指针类型转换
前提条件
Memory that has been bound to a type can be rebound to a different type only after it has been deinitialized or if the bound type is a trivial type
- 内存已经被 deinitialized
- 内存指向的类型是 trivial 的
被 deinitialized 的地址,有三种出路:
- 以相同类型被 reinitialized
- bound to a new type
- deallocated
typed pointer 状态转换
untrivial pointee

trivial pointee

相比之下,pointee 类型是 trivial 的,可以进行更多的操作。
Swift 里的指针的更多相关文章
- iOS: 学习笔记, Swift与C指针交互(译)
Swift与C指针交互 Objective-C和C API经常需要使用指针. 在设计上, Swift数据类型可以自然的与基于指针的Cocoa API一起工作, Swift自动处理几种常用的指针参数. ...
- 关于Swift中的指针的那些事
前言 在Objective-c的世界中,一切对象都是指针.它是一种运行时语言,具体指针的对象类型将会在运行时,由系统分配.这样虽然自由,但是却并不安全. Swift世界就不一样了,Swift的世界很安 ...
- c++继承构造子类调用父类构造函数的问题及关于容器指针的问题及当容器里储存指针时,记得要手动释放
看下面的一个问题: class Person { private: string name; public: Person(const string& s=""){ nam ...
- JAVA里面的“指针”
JAVA里面的“指针” 众所周知,在java里面是没有指针的.那为何此处还要说java里面的“指针”呢?我们知道在C/C++中,指针是指向内存中的地址.那么在Java里 ...
- Swift里performSelector方法的替代
最近在回答StackOverflow的问题时,发现performSelector方法在Swift被去掉,Apple的注释是这个方法被去掉是因为不安全: NOTE The performSelector ...
- Swift中的指针类型
Swift编程语言为了能与Objective-C与C语言兼容,而引入了指针类型.尽管官方不建议频繁使用指针类型,但很多时候,使用指针能完成更多.更灵活的任务.比如,我们要实现一个交换两个整数值的函数的 ...
- iOS开发-在Swift里使用AFNetworking方法
在OC里使用惯了AFNetworking,比较喜欢这一个第三方库,在别的途径里得知可以在Swift里使用AFNetworking.但是那个时候我不知道具体的操作是怎样的,于是我只能去百度.GOOGLE ...
- Swift里计数相关的小细节
Swift里对于字符串这些引入了index型,相对其他语言而言字符操作更安全了,但是问题就是一不注意搞错范围就会有各种离奇的bug. 在讲主题前,先说个小细节. Swift里非常严密的定义了一大堆字符 ...
- 如何在Swift里用UnsafeMutablePointer
下午在适配iPadUI的时候,用到了UIPopoverPresentationController,然后在转屏的时候需要调用UIPopoverPresentationControllerDelegat ...
随机推荐
- 洛谷P1169 棋盘制作(悬线法)
题目链接:https://www.luogu.org/problemnew/show/P1169 #include<bits/stdc++.h> #define fi first #def ...
- python--第十二天总结(Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy)
Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...
- mysql 查询语句严格区分大小写
一般情况下mysql 查询是不会区分大小写的,执行查询语句select id,current_unit from knowledge_attributes where current_unit = ...
- 网页屏蔽f12、右键菜单等操作
1.屏蔽f12 document.onkeydown = function(){ if(window.event && window.event.keyCode == 123) { a ...
- Python基础-python数据类型之集合(四)
集合 集合是一个无序的,不重复的数据组合,基本功能包括关系测试和消除重复元素. 集合对象还支持 union,intersection,difference和 sysmmetric difference ...
- docker日志设置定期清理
1.新建/etc/docker/daemon.json,若有就不用新建了 2.添加log-dirver和log-opts参数,样例如下 "log-driver":"jso ...
- 第六次spring会议
昨天所做之事: 我对软件加上了保密功能. 今天所做内容: 我对软件加上了一键解密功能. private void 一键还原ToolStripMenuItem_Click(object sender, ...
- ibatis (六) dynamic的用法
view plain copy print? dynamic可以去除第一个prepend="and"中的字符(这里为and),从而可以帮助你实现一些很实用的功能.具体情况如下: 1 ...
- Android 软件退出系统方法重写
Android 软件退出系统按键方法重写 //针对Andriod软件退出系统按键方法重写 ;//key down time @Override public boolean onKeyDown(int ...
- Acegi框架
Acegi(Acegi Security)框架,是一个能为基于Spring的企业应用提供强大而灵活安全访问控制解决方案的框架,Acegi已经成为 Spring官方的一个子项目,所以也称为Spring ...