【问题标题】:Get all existing pointers to an object获取指向对象的所有现有指针
【发布时间】:2011-12-22 08:00:44
【问题描述】:

是否可以获得指向目标 c 对象的指针的指针列表。

类似

id **pointers(id object, int *out_count)

很疯狂,对吧? =)

【问题讨论】:

  • 你是对的......它疯了..!!
  • 如果您告诉我们您要做什么,您可能会得到更好的答案。在这种形式下,我认为答案是,至少在编译器方面没有一些支持并且没有扫描整个进程内存(并过滤误报)。顺便说一句,为什么函数返回指向id 的指针? id 类型通常直接使用,我看不出从计数函数返回对象的意义。
  • @zoul: "id *" 是指向 id 的 C 数组的指针的类型,所以函数原型是有意义的......
  • 啊,我明白了。我没有意识到他也在寻找指针本身。
  • @CRD:这没有意义。数组的所有元素都是相同的,即您传入的 id。您需要一个指向 ids 的 指针 数组,即 id**

标签: objective-c objective-c-runtime


【解决方案1】:

很遗憾,没有。如果这样的事情通常是可能的,那么编写一个精确的垃圾收集器将相当简单:

int count;
pointers(obj, &count);
if (count == 0) {
    free(obj);
}

由于objective-c 垃圾收集器必须从根中获取指针,控制分配器,并保守地扫描堆栈以实现类似的目标,我认为假设您也需要这样做是合理的。

如果在 GC 模式下运行,则可以利用垃圾收集器的实现。不是一个好主意,不简单,也不能在 iOS 上工作,但也许是可能的。 libauto 毕竟是开源的。

【讨论】:

  • 垃圾收集器使用编译器支持来计算指向某个对象的(堆)指针的数量。它只计算堆栈和寄存器指针。但是泄漏工具会做类似的事情(扫描整个堆以查找指针)。所以可能值得研究一下。
  • 实际上这就是 ARC 所做的。当至少有一个指针时,它将对象保存在内存中。
  • @Denis Mikhaylov:ARC 和垃圾收集器都依赖编译器来计算对对象的引用。
  • 这个假设的垃圾收集器不会收集循环。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-25
  • 2016-09-25
  • 1970-01-01
  • 2014-01-02
  • 1970-01-01
相关资源
最近更新 更多