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. 每日英语:U.S. Media Firms Stymied in China

    China's recent clampdown on foreign media is crimping the expansion plans of Western news organizati ...

  2. 每日英语:Political Gridlock, Beijing Style

    To admirers outside the country, China's political system stands far above the dysfunctional democra ...

  3. 关于ddx/ddy重建法线在edge边沿上的artifacts问题

    经验证,原来ddx/ddy这两个操作,在forward rendering与deferred rendering中存在着微妙的应用区别. 在forward rendering中,GPU shader会 ...

  4. js随机生成一个数组中的随机字符串以及更新验证码

    随机生成m,n范围的值得公式: Math.random()*(n-m)+m: 改正公式:Math.random()*(n+1-m)+m // 生成随机字符串function randomMixed(n ...

  5. Cents os 7下如何安装bzip2

    # Cents os 7下如何安装bzip2 ### 安装```yum search bzip2  //查询安装包 yum -y install bzip2.x86_64 ``` ### 原因---- ...

  6. 1. EM算法-数学基础

    1. EM算法-数学基础 2. EM算法-原理详解 3. EM算法-高斯混合模型GMM 4. EM算法-高斯混合模型GMM详细代码实现 5. EM算法-高斯混合模型GMM+Lasso 1. 凸函数 通 ...

  7. PHP文件常用函数

    feof() 判断文件是否超出了文件末尾. <?php $files = fopen("1.txt","r+"); fread($files,filesi ...

  8. [转]SSH和SSM对比总结

    原文地址:https://blog.csdn.net/peak_and_valley/article/details/52925032 当下流行的两种企业开发MVC开源框架,是我们Java程序猿必备知 ...

  9. InstallShield打包,以及集成TFS、JenKins

    一. InstallShield打包脚本教程,这里面写的很详细了 [海洋女神原创]一个完整的Installshield安装程序实例—艾泽拉斯之海洋女神出品(一)---基本设置一 需要补充的是Insta ...

  10. ApplicationContextAware接口的作用

      1/============== 在Web应用中,Spring容器通常采用声明式方式配置产生:开发者只要在web.xml中配置一个Listener,该Listener将会负责初始化Spring容器 ...