sizeof与MemoryLayout

sizeof 在C语言中,可能会经常与sizeof打交道,用来计算数据占用内存大小。在C中sizeof即可以作用于类型也可以作用于某个实际的变量,并返回其在内存中的尺寸size_t。 在Swift 3以前,也有sizeof,不过与C中的运算符不同,它经过了一层包装,变成了一个只接受类型的方法,而接受具体值的则为另一个方法: sizeofValue func sizeof<T>(_: T.Type) -> Int func sizeofValue<T>(_: T) -> Int 不过sizeofValue接受的虽然是具体值,但是返回的是这个值的实际大小,而不是其内容的大小。所以与C中用sizeof拿来计算数组内容在内存中占据的尺寸不一样: // C char bytes[] = {1, 2, 3}; sizeof(bytes); // 3 int bytes[] = {1,…

Swift中的指针

Apple 期望在 Swift 中指针能够尽量减少登场几率,因此在 Swift 中指针被映射为了一个泛型类型,并且还比较抽象。这在一定程度上造成了在 Swift 中指针使用的困难,特别是对那些并不熟悉指针,也没有多少指针操作经验的开发者 (包括我自己也是) 来说,在 Swift 中使用指针确实是一个挑战。在这篇文章里,我希望能从最基本的使用开始,总结一下在 Swift 中使用指针的一些常见方式和场景。这篇文章假定你至少知道指针是什么,如果对指针本身的概念不太清楚的话,可以先看看这篇五分钟 C 指针教程 (或者它的中文版本),应该会很有帮助。 初步 在 Swift 中,指针都使用一个特殊的类型来表示,那就是 UnsafePointer<T>。遵循了 Cocoa 的一贯不可变原则,UnsafePointer<T> 也是不可变的。当然对应地,它还有一个可变变体,…

iOS内存用量分析

前言 我们在查看iOS应用内存时,最常见的手法就是查看左边的Debug Navigator。不知你是否也曾困惑于这个内存究竟包括哪些部分,或者使用Allocations模版观察内存时发现无法和Debug Navigator显示的内存匹配上,这篇文章将带你解答这些疑惑。 Debug Navigator VS Allocations 我们运行一个很简单的iOS App,我只在ViewController中放置了一个View,然后对比下Debug Navigator 和 Allocations给出的内存用量。 可以发现,Debug Navigator给出的是79.3M,而Allocations统计的所有堆和相关VM加起来才38.72M,相差的还是很多的。在之前的文章中我有介绍关于Allocations和VM Tracker的深入理解,其实Allocations中主要包含的是所有MALLOC_XXX VM Region和部分App进程创建的VM Region。非动态的内存,以及部分其他动态库创建的VM Region并不在Allocations的统计范围内。比如主程…

2018

2018最后一天,总感觉要说点什么才舒服,但是事实上并不会。 这一年真的很忙,忙到自己的都没什么时间。博客好久没更新了,上一次更新,已经是好几个月前了。 朝九晚十的工作已经成为了习惯,或许这也只是为自己的懒惰找了一个借口吧。 昨天晚上躺在床上,找出了我最喜欢的2004无与伦比演唱会重温了一遍。太妈的太帅了,太他妈的经典了,每一首歌,都是我逝去的青春,为了防止晚上看多了感动到大小便失禁,我还是忍住了只看了一遍。 这一年真的快,快到才知道什么叫眼睁睁的看它溜走,快到让你无奈,快到让你无所适从。 逢8的年份果然都不是什么好年,98年洪水,08年地震,18年股市暴跌、币圈暴跌、大规模公司裁员、互联网寒冬、P2P暴雷···早在17年就预料逢8必炸,但是毕竟上天是洪水猛兽,螳臂当车,你挡都挡不住,该来的还是要来。 中国是一个讲究仪式感的国家,就像我这篇博客一样,虽然噼里啪啦写了一堆,可能一点卵用也没有,但是讲究的是一种仪式感。 晚上跟十年老友朋友吃饭,我说"哎,一年又完了,真【文明】快啊。" "…

Swift性能相关

由于Swift4已经趋于稳定,最新的项目开始使用Swift开发,之前只是在实验中用过Swift,并未进行深入研究和应用到实际开发,而且还有一些疑惑,这几天查阅相关资料之后做了一些总结 Swift中的类型 * 平凡类型 有些类型只需要按照字节表示进行操作,而不需要额外工作,我们将这种类型叫做平凡类型 (trivial)。比如,Int 和 Float 就是平凡类型,那些只包含平凡值的 struct 或者 enum 也是平凡类型 struct AStruct { var a: Int } struct BStruct { var a: AStruct } //AStruct和BStruct都是平凡类型 * 引用类型 对于引用类型,值实例是一个对某个对象的引用。复制这个值实例意味着创建一个新的引用,这将使引用计数增加。销毁这个值实例意味着销毁一个引用,这会使引用计数减少。不断减少引用计数,最后当然它会变成 0,并导致对象被销毁。但是需要特别注意的是,我们这里谈到的复制和销毁值,只是对引用计数的操作,而不是复制或者销毁对象本身 struct…

震惊,惋惜!

你是我bytedance三面的面试官,是我入职后第一个见的人,也是我直属leader。 记得你加我微信的第一句话就是“一个优秀的开发者,都有着自己的博客。你的博客我刚刚拜读完了”,而我的第一句话是“能和一群优秀的人一起工作,是我的荣幸”。 我看了下你的朋友圈,85后,五年腾讯视频team履历,之前还呆过盛大,第一印象,大佬! 刚入职的时候,压力很大,每天都很拼命的去花很多时间去学习团队文档,规范,基本都是晚上10点才走,然后你lark消息提醒我让我注意下休息,没事就早 点回家。刚开始我以为你家就在附近,后来才知道你家在福田,每天基本都在我之后才走。 每天早上,我都会提前40分钟至1个小时到公司,我觉得这段时间能自由干点自己的事情,比如看看书提升一下,或者完成一下昨日未做完的事情。几乎同一时 间我刚坐下打开电脑,你就会背着书包从我椅子后面走过,打一声招呼“早”。 由于你是team负责人,又坐在我旁边,每天我都看得到你忙里忙外,从各种会议到新项目规划与开发,再到与下属的OKR制定与建议,几乎每天的时间都已经 安排到秒。 我曾自己多次想问一下你是如何在这样的强度下保持活力的,…

vConsole预研

介绍 一个轻量、可拓展、针对手机网页的前端开发者调试面板 Github传送门:https://github.com/Tencent/vConsole 功能 * 查看 console 日志 * 查看网络请求 * 查看页面 element 结构 * 查看 Cookies 和 localStorage * 手动执行 JS 命令行 * 自定义插件 理解 前端同学在开发Browser端时,能使用Chrome自带一键F12检查功能来方便调试,但是在移动端就没这么方便了。可能也有其他类似支持安卓调试的Chrome插件等辅助使用,但是个人感觉都没有vConsole直接在手机上使用这么直观、简单。对于vConsole框架,简单来说,就是为了方便前端在移动端调试时而开发的一套控制台系统,能够直接在移动设备一键展示打印日志、网络请求、查看Cookie等功能,最库被编译压缩成一个vconsole.min.js文件,前端使用时直接引入该文件即可。 实验和演示 为了演示和实验前后端交互和使用方法,深入了解整个流程,直接一部刨到问题的 祖坟。我用Java简单写了一个本…