zoukankan      html  css  js  c++  java
  • IOS ARC 与 JAVA 垃圾回收,

    相同:

    1,最后结果都是 释放不需要的空间,

    不同:

    assign(weak):直接赋值

    retain(strong):+1,引用一次 调用一次 retain

    release:-1

    copy:两个变量不共享内存,各有各的内存

    atomic:原子操作(多线程时使用)

    nonatomic:非原子操作

    @autorelease pool:维护一个引用池

    a.先建立一个autorelease pool
    b.对象从这个autorelease pool里面生成。
    c.对象生成 之后调用autorelease函数,这个函数的作用仅仅是在autorelease pool中做个标记,让pool记得将来release一下这个对象。
    d.程序结束时,pool本身也需要rerlease, 此时pool会把每一个标记为autorelease的对象release一次。如果某个对象此时retain count大于1,这个对象还是没有被销毁
    上面这个例子应该这样写:
    ClassName *myName = [[[ClassName alloc] init] autorelease];//标记为autorelease
    [classA setName:myName]; //retain count == 2
    [myName release]; //retain count==1,注意,在ClassA的dealloc中不能release name,否则release pool时会release这个retain count为0的对象,这是不对的。

    记住一点:如果这个对象是你alloc或者new出来的,你就需要调用release。如果使用autorelease,那么仅在发生过retain的时候release一次(让retain count始终为1)。

    ARC:

    1,是编译时候 ,插入到代码当中,release,retain,

    2,管理范围大小不同,ARC 对 C代码,对core foundation代码 没有管辖的权利

    3,当我们在Core Foundation的C函数和Foundation Kit的Objective-C方法间传递对象时,常常需要进行id和void*两个类型的互转。如果使用ARC,必须在CF对象进入和脱离ARC的控制时,用提示/限定符来告知编译器。限定符有__bridge、__bridge_retain和__bridge_transfer。另外,仍需要用CFRetain和CFRelease来管理Core Foundation的对象。

    JAVA:

    1,是运行时候,也跑着专门一个清理的工具,当引用为0的时候就释放空间。还有一种是 图的遍历,可达不可达,

    2,对所有的对象 都进行管理

    综上:可以理解为 ARC是 垃圾回收的一部分   ps:欢迎讨论交流,

    补充:

    Java的内存分配上,主要分4个块!
    一块是用来装代码的,就是编译的东西。
    一块是用来装静态变量的,例如用static关键字的变量,例如字符串常量。
    一块是stack,也就是栈,是用来装变量和引用类型的!但区别在于,装了变量以后,变量上是有值的,而引用类型本身在stack上是没有值的。
    一块是heap,也就是堆!堆可以一句话概括,装new出来的东西!

    综上:基本数据类型都在stack中,而引用类型,变量是放在stack中,真正有内容的东西放在heap中,也就是当new了一个新的引用类型,他就会放在堆中,同时栈中的引用类型变量会指向堆中你new出来的东西!
  • 相关阅读:
    网站迁移服务器后CPU、内存飙升,设置robots.txt 问题
    System.Web.Mvc 找到的程序集清单定义与程序集引用不匹配
    滑动窗口协议
    TCP拥塞控制
    计网常用协议
    TCP协议中的三次握手、四次挥手
    浏览网页的详细过程
    docker网络模式
    openstack网络
    查找算法
  • 原文地址:https://www.cnblogs.com/guligei/p/3876582.html
Copyright © 2011-2022 走看看