当前位置:  开发笔记 > 编程语言 > 正文

查找谁有对象的保留计数

如何解决《查找谁有对象的保留计数》经验,为你挑选了3个好方法。

我有一个UIViewController,当我实例化它时,它的retainCount为3.这让我觉得非常不正确.找出谁将retainCount提升到3的最佳方法是什么?我想像实例化对象应该给指针1,然后我想可能把它推到UINavigationController的堆栈上可能会碰到它(虽然不确定?),但第三个......是个谜.



1> danielpunkas..:

亚当是对的,你不应该过分关注保留计数.

但是如果你有合理的需要来解决这样一个谜团,一个好的技术是将受影响的类子类化,这样你就可以为内存管理方法添加覆盖.

例如,在UIViewController的子类中,您可以实现:

- (id) retain
{
    // Break here to see who is retaining me.
    return [super retain];
}


quano - 你看看调试器的堆栈跟踪.你会看到究竟是谁在调用retain.

2> Adam Rosenfi..:

不要直接依赖保留计数.发生的事情是,在初始化过程中,某些代码已经retain编辑autorelease了对象.因为你不能告诉对象已经有多少次autorelease,你实际上并不知道实际的保留计数是多少.

保留计数应仅用作调试辅助,而不应用作程序控制流程.

只要遵循"可可内存管理编程指南"中规定的所有规则,就不会有问题.



3> Peter Hosey..:

找出谁将retainCount提升到3的最佳方法是什么?

那是从错误的角度接近问题.这会使你感到困惑,并且导致你误入歧途(并且可能正确地过去)实际问题,当确实存在问题时.

最好考虑谁拥有该对象.您是否打算将对象保留为您自己的属性之一的值?如果是这样,那么你就是它的拥有者之一.如果没有,那么你不是.如果将对象传递给另一个对象以存储在其中一个属性中,则该另一个对象也是所有者.

这些所有权只是关系,所以很容易将它们直接放在脑海中.

"这是我的控制员之一.它拥有我的模型的根对象和一个或多个视图[控制器]."

"这是一种观点.它拥有我模型的某些部分."

"这是我模特的一部分.它只拥有原始物体."

"这是我模型的另一部分.它拥有一些原始对象和其他一些模型."

如果你已经掌握了你的所有权,那么除了忘记一个或消息(这可能发生在任何人身上)之外你不能写内存泄漏,并且你几乎肯定不会写一个循环保留(两个对象相互保留)除了明知并有大量的评论和#warnings.releaseautorelease

如果您还没有计算出您的所有权,那么您可能已经编写了一个或多个内存泄漏或您不了解的循环保留.


编辑:为了回答实际问题,最好的方法是找出保留的东西 - 并且可能随后自动释放 - 一个对象是使用仪器的分配工具.有了它,您可以查看任何对象的历史记录,以查看其地址的每个分配,保留,自动释放,释放和取消分配.

推荐阅读
mobiledu2402851323
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有