我能想到的唯一方法是创建一个 Object 的子类并添加增加/减少计数器的保留/释放方法,在该计数器上有一个观察者,在调用后调用同样在 Object 子类中的解构函数您将使用本机调用释放内存的解构器。
问题是所有对象都必须扩展这个新的子类,不是很向后兼容,你们能想出更好的方法吗?
我能想到的唯一方法是创建一个 Object 的子类并添加增加/减少计数器的保留/释放方法,在该计数器上有一个观察者,在调用后调用同样在 Object 子类中的解构函数您将使用本机调用释放内存的解构器。
问题是所有对象都必须扩展这个新的子类,不是很向后兼容,你们能想出更好的方法吗?
我不知道你为什么要这样做,但我们开始吧
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
}
}
您已经知道它完全没用,因为垃圾收集器正在处理所有事情。
此外,保留/释放并不是真正的垃圾收集机制,而是保留计数器。Objective-c 提供了它的“垃圾收集器”,但它只适用于 OSX 平台,而不是 iOS。
要回答您的问题,模仿objective-c 的唯一方法是深入JVM 的根目录。看看这个sun.misc.Unsafe
类,在那里你可以访问直接内存(有一些限制)声明变量并释放它们。不幸的是,我目前在公司防火墙后面,所以我不能给你任何链接。稍后再试。只需谷歌搜索 java 直接内存访问和类似的短语。
一些链接,我会尽快添加更多:
无论如何,与其花太多时间在这上面,我会开始阅读有关 JVM 和垃圾收集器调优的内容,你将获得很少有人拥有的技能。
好读:-)
不知道为什么要让它与每个类一起工作,有一个全局对象,您可以将保留和释放方法与您计划保留/释放的对象一起发送到该对象。
这个全局对象可以简单地管理将它们放入具有保留计数的集合中,这与挂在该对象上是一样的,对吧?
memoryManager.retain(obj);
memoryManager.release(obj);
请记住,如果您在模仿 Objective-C(而不是 ARC),则对象不需要跟踪它所引用的内容。相反,程序员会跟踪它,并根据需要“手动”保留/释放。无需自动跟踪链接的对象。
你真正需要模仿的是一个(咳嗽)单例,它支持retain(Object)
和release(Object)
方法并在内部管理对象指针到引用计数的映射。Map 中的对象指针确保对象将一直存在,直到计数变为零(此时 Map 条目将被删除)。在计数变为零之后但在删除 Map 条目之前,您可以调用对象的dealloc
方法(如果它有一个 - 测试它是否实现了 Dealloc 接口)。
(但我看到这与 SomeGuy 的建议基本相同。)