【问题标题】:Objective-C: how to tell which other object is retaining a specific object?Objective-C:如何判断哪个其他对象保留了特定对象?
【发布时间】:2009-09-26 18:25:44
【问题描述】:

在Objective C中,有没有办法在运行时确定一个对象是否被保留,哪个其他对象可能会保留该对象?

或者换个说法:

如果狗身上有皮带,是否有可能知道谁在牵着皮带?

假设您有这个假设场景:

我的对象一

我的对象二

MyObjectTwo 的实现内部是这样的

- (void)setFirstObject:(MyObjectOne *)firstObj {
 [firstObj retain];
    // do stuff with object and under certain conditions don't release it    
}

现在在代码的其他地方可能有其他地方创建和保留对象

// Create the two objects
myFirstObject = [[MyObjectOne alloc] init];   
mySecondObject = [[MyObjectTwo alloc] init];

// ...
// Some process requires retaining the first object 
[myFirstObject retain]

// ...
// some other place requires passing the first object to the second object
// at which point the first object is retained by the second object 
[mySecondObject setFirstObject:myFirstObject];

// ...
// further on the first object is released
[myFirstObject release]

此时理论上 myFirstObject 的保留计数应该为 1,因为它保留在 MyObjectTwo 中。是否也有可能知道保留对象的内容是什么?换句话说,可以知道 myFirstObject 的保留计数为 1,并且它当前由 mySecondObject 保留。有没有一种方便的方法可以找到这些信息?是否有可能有像这个伪代码一样工作的条件代码:

if (MyObjectTwo is retaining MyObjectOne)
{
 // do something in particular
}

再往前走几步,说 myFirstObject 的保留计数高于 1,并且还有其他对象 MyObjectThree 和 MyObjectFour 的行为类似于 MyObjectTwo,因为它们具有可以保留 MyObjectOne 的方法。现在假设有多个 MyObjectTwo、MyObjectThree 和 MyObjectFour 实例,其中一些保留第一个对象,而另一些则不保留。有没有办法知道谁和什么在做保留?

仍在学习,所以我的语法可能不是 100% 正确,但希望问题很清楚。

【问题讨论】:

    标签: objective-c


    【解决方案1】:

    不,你不能那样做。对象不会跟踪谁保留了它们,而且并不总是存在这样的对象,因为您可以从没有关联对象的普通 C 函数内部调用 retain

    如果您想跟踪谁在保留一个对象,您需要自己执行此操作。每次保留时,您都会将自己添加到保留者列表中,例如NSArray 在被保留的对象内。

    我不知道你到底想做什么,但几乎可以肯定你的做法是错误的。弄清楚谁保留了大部分时间并不真正有用的东西,并且可能有更好的方法来做你想做的事情。

    【讨论】:

    • 感谢您的回复。我并没有特别想做什么。我只是想知道这在理论上是否可行。将自己添加到保持器数组列表中的概念是有意义的。
    【解决方案2】:

    如果你只是想调试一些东西,你可以覆盖其实例似乎卡在内存中的类的retain 方法。然后在覆盖的方法中设置一个断点,每次断点触发时,您都会在堆栈上看到保留器。

    【讨论】:

    • 有道理。感谢您的提示。
    • 很棒的提示。以下是覆盖保留的方法: - (id)retain; {返回[超级保留]; }
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多