Tagged Pointer】的更多相关文章

前言 在2013年9月,苹果推出了iPhone5s,与此同时,iPhone5s配备了首个采用64位架构的A7双核处理器,为了节省内存和提高执行效率,苹果提出了Tagged Pointer的概念.对于64位程序,引入Tagged Pointer后,相关逻辑能减少一半的内存占用,以及3倍的访问速度提升,100倍的创建.销毁速度提升.本文从Tagged Pointer试图解决的问题入手,带领读者理解Tagged Pointer的实现细节和优势,最后指出了使用时的注意事项. 问题 我们先看看原有的对象为…
前言 这篇博客九月就想写了,因为赶项目拖了到现在,抓住17年尾巴写吧~ 正文 上次看了一篇 <从一道网易面试题浅谈OC线程安全> 的博客,主要内容是: 作者去网易面试,面试官出了一道面试题:下面代码会发生什么问题? @property (nonatomic, strong) NSString *target; //.... dispatch_queue_t queue = dispatch_queue_create("parallel", DISPATCH_QUEUE_CO…
前言: ​ 从64位开始,iOS引入了Tagged Pointer技术,用于优化NSNumber.NSDate.NSString等小对象的存储. Tagged Pointer主要为了解决两个问题: 内存资源浪费,堆区需要额外的开辟空间 访问效率,每次set/get都需要访问堆区,浪费时间, 而且需要管理堆区对象的声明周期,降低效率 Tagged Pointer特点: 专门用来存储小对象,比如NSString,NSNumber,NSDate Tagged Pointer指针的值不再是堆区地址,而是…
一,2013年9月,苹果推出了iPhone5s,与此同时,iPhone5s配备了首个采用64位架构的A7双核处理器,为了节省内存和提高执行效率,苹果提出了Tagged Pointer的概念. 对于64位程序,引入Tagged Pointer后,相关逻辑能减少一半的内存占用,并有3倍的访问速度提升,以及100倍的创建,销毁速度提升. 二,当8字节可以承载用于表示的数值时,系统就会以Tagged Pointer的方式生成指针,如果8字节承载不了时,则又用以前的方式来生成普通的指针. 三,Tagged…
[Tagged Pointers] 1.what is tagged pointer? 2.原理剖析…
NSFileManager NSBundle Class Cluster 采用Tagged Pointer的字符串 NSPathStore iOS证书ipa包重签名探究 url 结构 1. iOS 沙盒结构 App 安装时候,在系统分配的沙盒中创建一系列的容器(Container).例如:Bundle Container/ Data Container/ iCloud Container mobile/Containers/Data/Application 2. 沙盒固定的文件夹 根据上图所示:…
<iOS开发进阶>基本信息作者: 唐巧 出版社:电子工业出版社ISBN:9787121247453上架时间:2014-12-26出版日期:2015 年1月开本:16开页码:268版次:1-1   内容简介    计算机书籍<iOS开发进阶>分工具.实践.理论三大部分.第一部分介绍iOS 开发的常用工具,第二部分介绍iOS开发中的一些常见的实践经验,第三部分介绍iOS 开发中涉及的原理.如果把成为iOS 开发高手的过程比作武侠小说中的修炼过程的话,工具.实践和理论的学习就分别对应兵器…
Swift 圈中有一个被反复讨论的话题是:何时使用struct,何时使用class.我觉得今天我也要给出我的个人观点. 值 VS 引用 答案真的很简单了:当你需要用值语义的时候使用class,需要用引用语义使用struct.就是这样! 我们下周再见- 等下 干啥? 还没回答我的问题呢 你啥意思?答案不明摆着么? 哦,但是- 啥? 什么是值/引用语义? 哦我明白了,我可能接下来会探讨下. 还有他们是如何关联到class和struct上的 嗯 所有都归根结底到数据以及数据存储的位置.我们把东西存在局…
来源:冬瓜争做全栈瓜 链接:https://desgard.com/weak/ 对于 runtime 的分析还有很长的路,最近在写 block 系列的同时,也回顾一下之前疏漏的细节知识.这篇文章是关于 weak 的具体实现的学习笔记. runtime 对 __weak 弱引用处理方式 切入主题,这里笔者使用的 runtime 版本为 objc4-680.tar.gz. 我在入口文件 main.m 中加入如下代码: int main(int argc, const char * argv[]) {…
以前只是看了很多博客,这次打算看一下源码,并记录下来.想到哪里就读到哪里,写到哪里.读的代码版本是:objc runtime 680,可以从这里下载 https://github.com/RetVal/objc-runtime 对象与 isa 指针 开始阅读源码,首先 打开 objc-private.h文件,查看对于 Objectiv-C 的对象的定义 struct objc_object { private: isa_t isa; public: void initIsa(Class cls…
浅拷贝:指针拷贝,指针与原指针地址相同,没有创建新的对象. 深拷贝:内容拷贝,创建了新的对象,指针地址与原对象的指针地址不同. NSString测试代码如下 打印结果如下(后面打印出的两个NSCFConstanaString与NSCFString是打印出系统底层实现时调用方法的类) 设置一个断点来鼠标放到变量上查看结果如下     从上面左图可以看出copyStr1它的真实类型为不可变字符串,右图可以看出copyStr2为真实类型为可变字符串.从打印地址来看只有最后一个地址不同. 结论:对一个N…
本文转载自:https://juejin.im/post/5b1cb5805188257d507be5d4所有权归原文所有 WWDC 2018 Session 401 What's New in Swift? 这个 Session 分为两个部分,前半部分会简单介绍一下 Swift 开源相关的事情,后半部分我们深入了解一下 Swift 4.2 带来了哪些更新. 社区的发展 首先我们来看一下 Swift 的一些统计数据,Swift 自开源之后,总共有 600 个代码贡献者,合并了超过 18k pul…
毕竟汇编语言代码比较晦涩难懂,因此这里将函数的实现反汇编成C语言的伪代码: //下面的结构体中只列出objc_msgSend函数内部访问用到的那些数据结构和成员. /* 其实SEL类型就是一个字符串指针类型,所描述的就是方法字符串指针 */ typedef char * SEL; /* IMP类型就是所有OC方法的函数原型类型. */ typedef id (*IMP)(id self, SEL _cmd, ...); /* objc_msgSend的C语言版本伪代码实现. receiver:…
1.针对上下文的Snapshot技术 什么是上下文(Contexts)?实际是JS应用程序的运行环境,避免应用程序的修改相互影响,例如一个页面js修改内置对象方法toString,不应该影响到另外页面.chrome浏览器每个process只有一个V8引擎实例,浏览器中的每个窗口.iframe都对应一个上下文. ‍ V8启动时(在执行client js前),需要对全局上下文(第一个context)初始化,读取和解析自实现的内置JS代码(另一种技术,第2点),建立起function.array.st…
前言 我第一次开始重视Objective-C Runtime是从2014年11月1日,@唐巧老师在微博上发的一条微博开始.   这是sunnyxx在线下的一次分享会.会上还给了4道题目.   这4道题以我当时的知识,很多就不确定,拿不准.从这次入院考试开始,就成功入院了.后来这两年对Runtime的理解慢慢增加了,打算今天自己总结总结平时一直躺在我印象笔记里面的笔记.有些人可能有疑惑,学习Runtime到底有啥用,平时好像并不会用到.希望看完我这次的总结,心中能解开一些疑惑. 目录 1.Runt…
要了解 isa 指针先了解下类的定义在xcode中用快捷键Shift+Cmd+O 搜索objc.h 能看到类的定义:了解 Paste_Image.png 可以看出:objc_object:Objective-C对对象的定义, 其质上是结构体对象,其中 isa是它唯一的私有成员变量,即所有对象都有isa指针Class 是一个 objc_class 结构类型的指针id是一个 objc_object 结构类型的指针,这也是id可以指向任何对象的原因SEL(方法选择器)是一个objc_selector结…
http://blog.csdn.net/null29/article/details/71191044 在 32 位环境下,对象的引用计数都保存在一个外部的表中,每一个对象的 Retain 操作,实际包括如下 5 个步骤: 获得全局的记录引用计数的 hash 表: 为了线程安全,给该 hash 表加锁: 查找到目标对象的引用计数值: 将该引用计数值加 1,写回 hash 表: 给该 hash 表解锁. 而在 64 位环境下,isa 指针也是 64 位,实际作为指针部分只用到其中 33 位,剩余…
1.成员变量和属性的区别 @interface Person : NSObject { NSString *_sex; } @property (nonatomic, copy) NSString *name; @end //定义一个Person类,在类里面分别定一个成员变量_sex和属性name 成员变量: 1. 成员变量的默认修饰是@protected. 2. 成员变量不会自动生成set和get方法,需要自己手动实现. 3. 成员变量不能用点语法调用,因为没有set和get方法,只能使用->…
人们似乎觉得编写垃圾回收机制是非常难的,是一种仅仅有少数智者和Hans Boehm(et al)才干理解的高深魔法.我觉得编写垃圾回收最难的地方就是内存分配,这和阅读K&R所写的malloc例子难度是相当的. 在開始之前有一些重要的事情须要说明一下:第一.我们所写的代码是基于Linux Kernel的.注意是Linux Kernel而不是GNU/Linux.第二,我们的代码是32bit的.第三.请不要直接使用这些代码.我并不保证这些代码全然正确,可能当中有一些我还未发现的小的bug,可是总体思路…
第三部分:iOS开发底层原理 1.Objective-C对象模型 1.1 isa指针 NSObject.h部分代码: NS_ROOT_CLASS @interface NSObject <NSObject> { Class isa; } objc.h部分代码: typedef struct objc_class *Class; typedet struct objc_object { Class isa; } *id; 每个对象都有一个名为isa的指针,指向该对象的类 isa指针指向流程图如下…
在分析objc_msgSend之前,先来搞清楚另一个问题. 函数是什么?可能会答 void foo(void) {} 像这样就是一个函数.或者函数包括函数原型和函数定义,是一段执行某样功能的机器代码. 调用函数时必须要准备两个要素,函数原型和函数入口地址. 函数原型的作用是什么?答声明了函数调用的方式.不够具体.函数原型是函数调用方和函数定义之间的关于参数传递和结果返回的协议约定.这个协议分别作用在函数入口两边的代码,一边是调用方在调用处协议的构建,另一边是函数定义对协议的访问解释.传统地就是调…
目录 6 SWIG 和 C++ 6.1 关于包装 C++ 6.2 方法 6.3 支持的 C++ 功能 6.4 命令行选项与编译 6.5.1 代理类的构造 6.5.2 代理类中的资源管理 6.5.3 语言特定的细节 6.6 简单 C++ 包装 6.6.1 构造函数和析构函数 6.6.2 默认构造函数.拷贝构造函数和隐式析构函数 6.6.3 当不能创建构造函数包装器时 6.6.4 拷贝构造函数 6.6.5 成员函数 6.6.6 静态成员 6.6.7 成员数据 6.7 默认参数 6.8 保护 6.9…
swift是对oc的扩展 Swift是没有消息机制的Objective-C https://www.oschina.net/translate/inside-swift: swift保持了oc的类结构形式,对函数的派发机制做了调整. 一.class swift完全继承了oc class类的运行时结构: 或者说swift class 和 oc class的运行时结构具有等价性: swift的编译器将class的缺省运行机制编译为静态派发和虚函数表派发: 添加特殊@objec符号后,使用的是oc运行…
https://developer.apple.com/wwdc/videos/ Advances in Objective-C What's New in the LLVM Compiler 下面是一些凌乱的笔记... objc 流行度已超过 c++ #import 会自动翻译成 @import, 对编译的提速效果相当于整很多 pch. (enable modules ) 64 位机器上会像 ruby 一样用 tagged pointer 实现一些值对象 (如 NSDate), 减少动态内存分…
第一部分:iOS开发工具 第二部分:iOS开发实践 第10章 理解内存管理 10.1 引用计数 10.1.1 什么是引用计数,原理是什么 10.1.2 我们为什么需要引用计数 10.1.3 不要向已经释放的对象发送消息 10.1.4 循环引用(reference cycles)问题 10.1.5 使用Xcode检测循环引用 10.2 使用ARC 10.2.1 Automatic Reference Count 10.2.2 Core Foundation对象的内存管理 第11章 掌握GCD 11…
苹果设备备受欢迎的背后离不开iOS优秀的内存管理机制,那iOS的内存布局及管理方案是怎样的呢?我们一起研究下. 内存管理分为五大块 栈区(stack):线性结构,内存连续,系统自己管理内存,程序运行记录,每个线程,也就是每个执行序列各有一个(看crash log最容易理解),都是编译的时候能确定好的,还有一个特点就是这里面的数据可以不用指针,也不会丢. 堆区(heap):链式结构,内存不连续,最灵活的内存区,用途多多,动态分配和释放,编译时不能提前确定,我们的Objective-C对象都是这么来…
如何正确的hook方法objc_msgSend 前言 如果希望对 Objective-C 的方法调用进行 log, 一个很好的解决方法就是 hook 方法 objc_msgSend, 当然想到的就是利用 InlinkHook 直接 hook 完事, 然而 objc_msgSend 是一个可变参数函数, 这就有点蛋疼了. objc4-680, 和目前的 objc4-709 没有有很大出入. 以下 在举例 arm 相关时使用 objc4-680, 说明 x64 时使用 objc4-709 整个代码使…
一.Runtime 简介 Runtime 又叫运行时,是一套底层的 C 语言 API,是 iOS 系统的核心之一.开发者在编码过程中,可以给任意一个对象发送消息,在编译阶段只是确定了要向接收者发送这条消息,而接受者将要如何响应和处理这条消息,那就要由运行时来决定了. C 语言中,函数的调用在编译期就会决定调用哪个函数.而 OC 的函数属于动态调用过程,在编译期并不能决定真正调用哪个函数,只有在真正运行时才会根据函数的名称找到对应的函数来调用. Objective-C 是一个动态语言,不仅需要一个…
iOS高级进发 OC源码下载地址 苹果开发文档 如何阅读苹果开发文档 GNUstep是GNU计划的项目之一,它将Cocoa的OC库重新开源实现了一遍 源码地址:http://www.gnustep.org/resources/downloads.php 虽然GNUstep不是苹果官方源码,但还是具有一定的参考价值 iOS底层 1.一个NSObject对象占用多少内存 2.OC对象的分类 3.KVO实现原理 4.KVC实现原理 5.分类 5.1.分类的实现原理 5.2.Load和Initializ…
JVM中对象模型及相应名词概念 java对象在jvm中的模型是OOP-Klass 模型: klass klass对应元数据,包括常量池.字段.方法等.是在加载class阶段创建instanceKlass.存放在方法区. oop oop对应java中的实例. oop是指向oopDesc的指针. // share/vm/oops/oopsHierarchy.hpp typedef class oopDesc* oop; // SimonNote: oop是指向oopDesc的指针 oopDesc i…