0

我能想到的唯一方法是创建一个 Object 的子类并添加增加/减少计数器的保留/释放方法,在该计数器上有一个观察者,在调用后调用同样在 Object 子类中的解构函数您将使用本机调用释放内存的解构器。

问题是所有对象都必须扩展这个新的子类,不是很向后兼容,你们能想出更好的方法吗?

4

4 回答 4

0

我不知道你为什么要这样做,但我们开始吧

public class ReferenceCountedObject
{
    private int referenceCount;

    public ReferenceCountedObject()
    {
        this.retain();
    }

    public synchronized ReferenceCountedObject retain()
    {
        referenceCount++;
        return this;
    }

    public synchronized void release()
    {
        if (referenceCount == 1)
        {
            this.dealloc();
        }
        else
        {
            referenceCount--;
        }
    }

    protected void dealloc()
    {
        // memory will be freed by GC
    }
}
于 2013-10-11T15:56:51.230 回答
0

您已经知道它完全没用,因为垃圾收集器正在处理所有事情。

此外,保留/释放并不是真正的垃圾收集机制,而是保留计数器。Objective-c 提供了它的“垃圾收集器”,但它只适用于 OSX 平台,而不是 iOS。

要回答您的问题,模仿objective-c 的唯一方法是深入JVM 的根目录。看看这个sun.misc.Unsafe类,在那里你可以访问直接内存(有一些限制)声明变量并释放它们。不幸的是,我目前在公司防火墙后面,所以我不能给你任何链接。稍后再试。只需谷歌搜索 java 直接内存访问和类似的短语。

一些链接,我会尽快添加更多:

无论如何,与其花太多时间在这上面,我会开始阅读有关 JVM 和垃圾收集器调优的内容,你将获得很少有人拥有的技能。

好读:-)

于 2013-10-11T15:42:39.280 回答
0

不知道为什么要让它与每个类一起工作,有一个全局对象,您可以将保留和释放方法与您计划保留/释放的对象一起发送到该对象。

这个全局对象可以简单地管理将它们放入具有保留计数的集合中,这与挂在该对象上是一样的,对吧?

memoryManager.retain(obj);

memoryManager.release(obj);
于 2013-10-11T13:37:26.963 回答
0

请记住,如果您在模仿 Objective-C(而不是 ARC),则对象不需要跟踪它所引用的内容。相反,程序员会跟踪它,并根据需要“手动”保留/释放。无需自动跟踪链接的对象。

你真正需要模仿的是一个(咳嗽)单例,它支持retain(Object)release(Object)方法并在内部管理对象指针到引用计数的映射。Map 中的对象指针确保对象将一直存在,直到计数变为零(此时 Map 条目将被删除)。在计数变为零之后但在删除 Map 条目之前,您可以调用对象的dealloc方法(如果它有一个 - 测试它是否实现了 Dealloc 接口)。

(但我看到这与 SomeGuy 的建议基本相同。)

于 2013-10-11T15:33:07.267 回答