有没有一种方法可以检查NSAutoreleasePool的对象?

7

我想知道这是否可能,也许我可以检索给定的 NSAutoreleasePool 实例中当前存储的对象的 NSSet

我查看了苹果的 NSAutoreleasePool 参考文档,并没有找到与此问题相关的信息。


2个回答

11

如果仅用于调试,你可以使用函数_CFAutoreleasePoolPrintPools(),打印池的内容,具体可参考TN2124文档。该函数在Mac OS X 10.6及iOS 3.x以上版本中可用。

或者,类方法[NSAutoreleasePool showPools]也可以实现同样的功能。


哇塞,这太棒了。事实上,这正是我在寻找的! :) - Jacob Relkin
是的,这很好 - 它可以漂亮地打印出当前在池中的对象列表,但它无法返回对象集合。 :( - Jacob Relkin
@Jacob:存储对象的结构可以通过 pthread_getspecific(0x3e) 检索,但是由于这是一些内部 API,不能保证该结构在不同平台上不会被更改。既然内容已经打印到 stderr,您可以重新打开流并从中解析以获取所有指针。 - kennytm
你能提供一个例子吗?谢谢。 - Jacob Relkin
1
嘿,大家好 - showPools在4.2中已经被弃用了吗?我在文档中找不到它的存在或曾经存在的提及,编译器也找不到它。 - mobibob
只是为了其他遇到这个问题的人... showPools是NSAutoreleasePool上的一个私有类方法,这意味着它会给你构建警告,并且不会显示在可用方法列表中。只需将代码放入其中,您就可以在调试输出中列出当前线程池的内容。 - Red Nightingale

2
没有,细节实现NSAutoreleasePool是极其深奥的黑魔法。
你可以自己创建一个autorelease池,并设法欺骗运行时,让它使用你的池而不是NSAutoreleasePool。但只有为了尝试而这样做。
然而,除了实验和学习之外,您永远不应该改变autorelease的行为。否则我会找到你并让你重写你的代码。

@Dave 我想我会这样做! :-) - Jacob Relkin
@Dave 不用担心 - 这只是实验性质的,永远不会进入生产环境 - 我明白其中的危险,谢谢! :P - Jacob Relkin
2
@Jacob 我知道你会没事的;这只是一种针对其他人的卫生局警告,他们可能会认为我是认真建议这个。 - Dave DeLong
@Dave 哈哈。卫生局长的警告确实 - Jacob Relkin
@Dave,这是昨晚我提到的问题:https://dev59.com/oVTTa4cB1Zd3GeqPsW8o - Jacob Relkin
@Jacob 是的;NSExpression(由NSPredicate在内部使用)最终会调用目标对象上的-valueForKeyPath:,它最终会调用-valueForKey:,这会对于NSDictionary 执行一些特殊操作 - Dave DeLong

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接