引用计数

JavaScript高级程序设计- 变量、作用域和内存问题

我们两清 提交于 2020-02-27 07:07:01
4 变量、作用域和内存问题 理解基本类型和引用类型 理解执行环境 理解垃圾收集 变量的值及其数据类型可以在脚本的生命周期内改变。 4.1基本类型和引用类型 基本类型值指的是简单的数据段,而引用类型值指那些可能由多个值构成的对象。 ES5中 5 种基本数据类型: Undefined、 Null、 Boolean、 Number 和 String。这 5 种基本数据类型是按值访问的,因为可以操作保存在变量中的实际的值。ES6中新增Symbol 引用类型的值是保存在内存中的对象。 JavaScript 不允许直接访问内存中的位置,也就是说不能直接操作对象的内存空间。在操作对象时,实际上是在操作对象的引用而不是实际的对象,ES6中的Map,set,WeakMap,WeakSet 4.1.1 动态属性 定义基本类型值和引用类型值的方式是类似的:创建一个变量并为该变量赋值 引用类型可以 var person = new Object ( ) ; person . name = "threeSt" ; alert ( person . name ) ; //"threeSt" //基本类型不能添加 var name = "three" ; name . age = 26 ; console . log ( name . age ) //undefined 4.1.2 复制变量

Objecitive-C中的nil

让人想犯罪 __ 提交于 2019-12-29 19:58:20
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 当我学习OC的时候,我总是忍不住在对比。Actionscript是如何实现,而oc又是如何实现。这不,碰到nil的时候我发现了很大的不同之处。做个笔记。 在as中,如果将一个对象置为null,相当于空指针,那么后续对该对象的操作会报错。而在编码中,我们常常会判断if(obj == nul )来判断该对象是否存在,存在的话才可以进行后续操作。 而在oc中,nil就相当于c、c++中的NULL指针,一般释放对象后将对象置为nil非常重要,这样可以防止引用非法指针导致程序崩溃掉。 [obj release];//此时obj的引用计数为0 [obj someMethod];//程序崩溃 [obj release]; obj = nil; [obj someMethod];//obj此时为nil,但不会崩溃 在objective-c中我们只用nil来检查程序的逻辑,而不用于判断对象是否为空来避免崩溃。这与c++是不同。objective-c在运行时会自动处理向nil对象发送消息(调用方法),不会报错崩溃掉。 来源: oschina 链接: https://my.oschina.net/u/865151/blog/115702

oc的内存管理机制.及自动释放池的解析

安稳与你 提交于 2019-12-10 13:47:04
一.内存管理的方式 MRC 人工引用计数:内存的开辟和释放由程序代码无师自通控制,() ARC 自动引用计数(不是自动内存管理)(编译器帮助程序员默认加了释放代码) 在C中使用malloc和free oc中内存管理的机制 oc中提供了一个“引用计数”的机制来管理内存的。 每一个对象都有一个引用计数,对象在建立的时候引用计数为1,当引用计数为0的时候,对象将被系统统一销毁,我们可以通过调用一些方法来操作引用计数的值。 引用计数加1的方法有 alloc copy retain 以及其他类或对象的强引用,在arc中strong 相当于原来的 retain,weak相当于原来的assign,成员变量是弱指针. alloc 为一个新对象分配内存,并且它的引用计数为1,调用alloc方法,你便有对新对象的所有权 copy 制造一个对象的副本,该副本的引用计数为1,调用者具有对副本的所有 权 retain 使对象的引用计数加1,并且获得对象的所有权 放弃所有权的方法: release 使对象的引用计数减1,并且放弃对象的所有权 autorelease 使对象的引用计数在未来 的某个 时候 减1,并且在那个时候 放弃对象的所有权 注:arc中不允许调用release ,retain retainCount, 内存管理对于C语言基本类型无效. 所有oc对象都有一个计数器,保留着当前被引用的数量.

COM组件学习

北战南征 提交于 2019-12-07 10:04:58
COM组件是以Win32动态链接库(dll)或可执行的形式发布的可执行代码组成的。动态链接库本身并不能满足对于组件架构的需求。为了满足这些需求。组件还必须是封装的。 com组件是完全与语言无关的。 com组件可以以二进制形式发布。 com组件不妨碍老客户情况下升级。 com并不是一种计算机语言。 将com与dll相提并论也是不合适的。实际上com使用了Dll来给组件提供动态链接的能力。 com具有一个被称作是com库的API,他提供的是对所有客户及组件都非常有用的组件管理服务。 com组件在C++中是用纯抽象基类实现的。 一个com组件可以提供多个接口。 一个C++类可以使用多继承来实现一个可以提供多个接口的com。 客户请求服务时,只能通过接口进行。每一个接口都是有一个128位的全局唯一标识符GUID来标识 。客户通过GUID获得接口的指针,在通过接口指针,客户就可以调用其他相应的成员函数。具体功能如何实现,则完全由对象的接口内部实现。 每一个对象也用一个128位的GUID来标识,称为CLSID(类ID),客户程序可以由CLSID来创建COM对象。 接口特点: 1、二进制特性; 2、接口不变性; 3、继承性(可扩展性); 4、多态性(运行过程的多态性) COM定义的每一个接口都必须从IUnKnow继承过来。原因:IUnKnow接口提供了两个非常重要的特性: 生存期控制和接口查询

Cocos2d-x开发中Ref内存管理

孤人 提交于 2019-12-02 09:58:57
Ref类是Cocos2d-x根类,Cocos2d-x中的很多类都派生自它,例如,我们熟悉的节点类Node也派生自Ref。我们介绍Ref内存管理。 内存引用计数 Ref类设计来源于Cocos2d-iphone的CCObject类,在Cocos2d-x 2.x中也叫CCObject类。因此Ref类的内存管理是参考Objective-C手动管理引用计数(Reference Count)而设计的。 如图所示是内存引用计数原理示意图。 每个Ref对象都有一个内部计数器,这个计数器跟踪对象的引用次数,被称为“引用计数”(Reference Count,简称RC)。当对象被创建时候,引用计数为1。为了保证对象的存在,可以调用retain函数保持对象,retain会使其引用计数加1,如果不需要这个对象可以调用release函数,release使其引用计数减1。当对象的引用计数为0的时候,引擎就知道不再需要这个对象了,就会释放对象内存。 引用计数实例如图所示,我们在ObjA中使用new等操作创建了一个Ref对象,这时候这个对象引用计数为1。然后在OjbB中使用retain函数保持Ref对象,这时引用计数为2。再然后ObjA中调用release函数,这时引用计数为1。在ObjB中调用release函数,这时引用计数为0。这个时候Ref对象就会由引擎释放。 在Ref类中相关函数有:retain()

java常识

六月ゝ 毕业季﹏ 提交于 2019-11-28 16:10:25
java异常 java中广义的异常是指Throwable接口,这个接口下有两个实现类:Error和Exception。 Error表示严重的错误,一旦产生,则不做处理或者重写代码; 如果是Exception,分为检查异常和运行异常。检查异常在出现时必须处理,或者抛出或者捕获;运行异常在出现时可以处理可以不处理。 1 2 3 多线程 多线程是指一个进程中多个逻辑任务的执行,会产生安全问题,为了解决这个问题,可以利用同步代码块或者lock()方法. 1 java中的String String类是用final修饰的,因此不可被继承,其中重写了equals和hashCode方法,因此调用equals方法时比较的是两个字符串的值;String提供了比较多的构造方法,需要注意不同的构造方法所产生的对象的个数也不一样。用+连接运算拼接字符串的时候,调用的是StringBuilder中的append方法 1 Java中的String, StringBuffer, StringBuilder 这三个类都是final修饰的,都不可以被继承。String这个类是线程不安全的,其中的+连接运算用的是StringBuilder中的append方法,每一次的+都会产生一个新的StringBuilder,concat方法是将字符串转化为字符数组之后再进行合并,然后转化为字符串

垃圾回收机制

非 Y 不嫁゛ 提交于 2019-11-28 10:26:22
目录 垃圾回收机制   一、什么是垃圾回收机制   二、为什么要有垃圾回收机制   三、垃圾回收机制原理分析   1,引用计数   2,循环引用   3,标记-清除   4,分代回收 垃圾回收机制 ​ ​   我们定义变量会申请内存空间来存放变量的值,而内存的容量是有限的,当一个变量值没有用了(称为垃圾),就应该将其占用的内存给回收掉。变量名是访问到变量的唯一方式,所以当一个变量值没有任何关联的变量名时,我们就无法访问到该变量了,该变量就是一个垃圾,会被python解释的垃圾回收机制自动回收。   一、什么是垃圾回收机制   垃圾回收机制(简称GC)是python解释器自带的一种机制,专门用来回收不可用的变量值所占用的内存空间   二、为什么要有垃圾回收机制   程序运行过程中会申请大量的内存空间,而对于一些无用的内存空间,如果不及时清理的话,会导致内存使用完(内存溢出),导致程序崩溃,因此,内存管理是一件重要且繁杂的事情,而python解释器自带的垃圾回收机制把程序员从繁杂的内存管理中解放出来。   三、垃圾回收机制原理分析   python的GC模块主要采用了‘引用计数’来跟踪和回收垃圾。在引用计数的基础上,还可以通过‘标记-清除’来解决容器对象可能产生的循环引用的问题,并且通过‘分代回收’来以空间换取时间的方式进一步提高垃圾回收的效率。   1,引用计数   引用计数就是

PHP_ZVAL:引用计数,写时拷贝

允我心安 提交于 2019-11-27 08:17:36
1、php语言特性 PHP是脚本语言,所谓脚本语言,就是说PHP并不是独立运行的,要运行PHP代码需要PHP解析器,用户编写的PHP代码最终都会被PHP解析器解析执行 PHP的执行是通过Zend engine(ZE, Zend引擎),ZE是用C编写的 用户编写的PHP代码最终都会被翻译成PHP的虚拟机ZE的虚拟指令(OPCODES)来执行 也就说最终会被翻译成一条条的指令 既然这样,有什么结果和你预想的不一样,查看php源码是最直接最有效的 2、php变量的存储结构 zval 是Zend value 的简称,它是PHP 的基本存储单元。 PHP 程序执行过程中产生的每一个变量,在底层都与一个 zval 相对应。 在PHP中,所有的变量都是用一个结构zval结构来保存的,在Zend/zend.h中可以看到zval的定义: zval结构包括: ① value —— 值,是真正保存数据的关键部分,定义为一个联合体(union) ② type —— 用来储存变量的类型 ③ is_ref —— 下面介绍 ④ refcount —— 下面介绍 声明一个变量 $addr="北京"; PHP内部都是使用zval来表示变量的,那对于上面的脚本,ZE是如何把addr和内部的zval结构联系起来的呢? 变量都是有名字的(本例中变量名为addr) 而zval中并没有相应的字段来体现变量名

jvm的stack和heap,JVM内存模型,垃圾回收策略,分代收集,增量收集(转)

核能气质少年 提交于 2019-11-27 01:37:10
深入 Java 虚拟机: JVM 中的 Stack 和 Heap (转自: http://www.cnblogs.com/laoyangHJ/archive/2011/08/17/gc-Stack.html ) 在JVM中,内存分为两个部分,Stack(栈)和Heap(堆),这里,我们从JVM的内存管理原理的角度来认识Stack和Heap,并通过这些原理认清 Java 中静态方法和静态属性的问题。   一般,JVM的内存分为两部分:Stack和Heap。   Stack(栈)是JVM的内存指令区。Stack管理很简单,push一定长度字节的数据或者指令,Stack指针压栈相应的字节位移;pop一定字节长度数据或者指令,Stack指针弹栈。Stack的速度很快,管理很简单,并且每次操作的数据或者指令字节长度是已知的。所以 Java 基本数据类型, Java 指令代码,常量都保存在Stack中。   Heap(堆)是JVM的内存数据区。Heap 的管理很复杂,每次分配不定长的内存空间,专门用来保存对象的实例。在Heap 中分配一定的内存来保存对象实例,实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中),在Heap 中分配一定的内存保存对象实例和对象的序列化比较类似。而对象实例在Heap 中分配好以后