2017-01-23 23:32 506人阅读 评论(0) 收藏 举报
 分类:
Unity(13) 

版权声明:欢迎转载,注明出处即可~

由于C#本身有GC机制,当对象的引用为0的时候就会被垃圾回收,对应的引用则会被置为null, 但Unity里边,调Destroy删除一个Object,只是释放了Unity的资源,而在C#层面,这个Object对应的引用都还在,那么它便不会被当成垃圾回收掉,所以C#层的资源并没有释放,但是拿它的引用跟null做对比确实相等的。代码跟到Unity Object脚本的实现,Unity里的MonoBehaver是继承自Object的,包括所有的Component也都是。跟到Object类之后 发现以下几句:
 
  1. public static bool operator ==(Object x, Object y);
  2. public static bool operator !=(Object x, Object y);
Object类重载了操作符 == 和 !=  ,所以Destroy了一个Unity对象的之后,在C#层的资源其实并没有被释放掉,当拿对应的引用变量来跟null做== !=判定的时候,因为对应的这个实例其实还是存在的,所以就会走到 被重载的==和!=操作符里,然后Unity直接给返回了一个true.      
     到这里应该基本上都清楚了,不过今天跟同事讨论的时候,发现用System.object去引用一个Unity的Object对象,然后Destroy调这个Object,再拿这个system.object的引用去跟null比较,返回的也是true的,当时还没想通呢,因为System.object是C#自己的类,并没有重载== 和!=操作符,以为应该返回false才对。现在想想,当时竟然把面向对象的概念都忘了。System.object在C#里是所有类的父类,而Unity.Object也是C#写的,自然System.object也是Unity.Object的父类,那么拿一个父类引用对象去指向一个子类实例,而子类实例重载了父类的方法,那么父类里的方法自然就被隐藏掉了,实际调起的就是子类重载后的方法了。所以在上面的这个System.object引用Unity.Object的情况里,Object被Destroy之后,由于C#层的实例并没有被释放,所以当用System.object引用跟null做==判定的时候实际上走的还是Unity.Object里重载的这个==,因为这里的Unity.Object实际上是System.oobject的子类。
 
     这里说一个C#里另一个用来判null的操作符,?? 这个操作符并没有被Unity.Object重载,用来判Destroy之后的对象就不会返回true啦。

C#-----------------------------回收机制中Destroy与null的作用的更多相关文章

  1. dubbo源码分析2——SPI机制中的SPI实现类的读取和预处理

    SPI机制中的SPI实现类的读取和预处理是由ExtensionLoader类的loadFile方法来完成的 loadFile方法的作用是读取dubbo的某个SPI接口的spi描述文件,然后进行缓存,缓 ...

  2. MySQL InnoDB 日志管理机制中的MTR和日志刷盘

    1.MTR(mini-transaction) 在MySQL的 InnoDB日志管理机制中,有一个很重要的概念就是MTR.MTR是InnoDB存储擎中一个很重要的用来保证物理写的完整性和持久性的机制. ...

  3. java多线程机制中的Thread和Runnable()区别

    1.java语言使用Thread类及其子类对象来表示线程,新建的一个线程声明周期中经历 新建.(声明一个线程,此时他已经有了相应的内存空间和其他资源),运行(线程创建之久就据用了运行的条件,一旦轮到使 ...

  4. Linux内存管理机制中buffer和cache的区别

    Linux内存管理机制中buffer和cache的区别理解linux内存管理,需要深入了解linux内存的各个参数含义和规则,下面介绍一下Linux操作系统中内存buffer和cache的区别. Fr ...

  5. Java 反照机制中 getMethod()和getDeclaredField()区别

    Java 反射机制中 getMethod()和getDeclaredField()区别 今天在程序中用到java反射机制时,遇到的问题记录一下:我当时遇到的问题是,我用反射getMethod()调用类 ...

  6. AtomicStampedReference AtomicReference解决CAS机制中ABA问题

    AtomicStampedReference AtomicReference解决CAS机制中ABA问题 AtomicStampedReference AtomicStampedReference它内部 ...

  7. ARC机制中的Strong和weak

    什么是ARC Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入的最大的变革和最激动人心的变化.ARC是新的LLVM 3.0编译 ...

  8. (转)iOS消息推送机制中pem文件的生成

    转自:http://2015.iteye.com/blog/1567777 以前写了一篇文章:iOS消息推送机制的实现,这篇文章中生成的是p12文件,但是php是用的pem文件,生成的方法和p12文件 ...

  9. dubbo源码分析6——SPI机制中的AOP

    在 ExtensionLoader 类的loadFile方法中有下图的这段代码: 类如现在这个ExtensionLoader中的type 是Protocol.class,也就是SPI接口的实现类中Xx ...

随机推荐

  1. SolrCloud基本过程

    转:http://www.data321.com/yunjisuan/20160514880/SolrZhiJieDuQuZKZhongDePeiZhiXin SolrCloud之分布式索引及与Zoo ...

  2. js实现裁剪头像上传编辑器

    插件: 1.富头像上传编辑器是一款支持本地上传.预览.视频拍照和网络加载的flash头像编辑上传插件,可缩放.裁剪.旋转.定位和调色等. http://www.fullavatareditor.com ...

  3. Lintcode: Majority Number 解题报告

    Majority Number 原题链接:http://lintcode.com/en/problem/majority-number/# Given an array of integers, th ...

  4. mysql 添加外键时 error 150 问题总汇

    当你试图在mysql中创建一个外键的时候,这个出错会经常发生,这是非常令人沮丧的.像这种不能创建一个.frm 文件的报错好像暗示着操作系统的文件的权限错误或者其它原因,但实际上,这些都不是的,事实上, ...

  5. Java调用Python脚本工具类

    [本文出自天外归云的博客园] 在网上查了很多方法都不成功,在google上搜到一篇文章,做了一些小修改,能够处理中文输出.提取一个运行python脚本的Java工具类如下: package com.a ...

  6. 设计模式之原型模式(深入理解OC中的NSCopying协议以及浅拷贝、深拷贝)

    原型模式:用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象.原型模式其实就是从一个对象再创建另一个可定制的对象,而且不需知道任何创建的细节. 比如说,有一个Person类,有firstN ...

  7. 3. CNN卷积网络-反向更新

    1. CNN卷积网络-初识 2. CNN卷积网络-前向传播算法 3. CNN卷积网络-反向更新 1. 前言 如果读者详细的了解了DNN神经网络的反向更新,那对我们今天的学习会有很大的帮助.我们的CNN ...

  8. [转]Oracle 语法之 OVER (PARTITION BY ..) 及开窗函数

    oracle的分析函数over 及开窗函数 一:分析函数Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组 ...

  9. 开源一个爬取redmine数据的测试报告系统

    背景 软件测试的最后有一道比较繁琐的工作,就是编写测试报告.手写测试报告在数据统计和分析上面要耗费比较大的事件和精力.之前工作室使用mantis管理bug缺陷.公司有内部有个系统,可以直接从manti ...

  10. 前端常用功能记录(三)—datatables表格初始化(转)

    数据源 我经常使用的有两种,一种是JavaScript 中的数组,通过在初始化对象中传递一个名为 aaData 的数组,同样可以提供表格数据,前缀 aa 说明这是一个数组的数组,外层的数组表示表格的行 ...