在 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% 正确,但希望问题很清楚。
最佳答案
不,你不能那样做。对象不会跟踪谁保留了它们,并且并不总是有这样的对象,因为您可以从没有关联对象的普通 C 函数内部调用 retain
。
如果你想跟踪谁在保留一个对象,你需要自己做。每次保留时,您都会将自己添加到保留者列表中,例如被保留对象中的 NSArray
。
我不确切知道您要做什么,但几乎可以肯定您的做法是错误的。大多数时候,弄清楚谁在保留什么并不是一件真正有用的事情,而且可能有更好的方法来做你想做的事。
关于Objective-C:如何判断哪个其他对象保留了特定对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1481836/