在Objective C中,有没有办法在运行时确定是否保留了一个对象,哪个其他对象可能会保留该对象?
或者用一点点来区分它:
如果狗上有牵引带,是否可以知道谁牵着皮带?
假设您有这个假设情景:
MyObjectOne
和
MyObjectTwo
在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%正确,但希望问题很明确。
答案 0 :(得分:6)
不,你不能这样做。对象不会跟踪谁保留它们,并且并不总是存在这样的对象,因为您可以从没有关联对象的普通vanilla C函数内部调用retain
。
如果您想跟踪谁保留对象,您需要自己动手。每次保留时,您都可以将自己添加到保留器列表中,例如保留对象内的NSArray
。
我不确切地知道你要做什么,但你几乎肯定会以错误的方式去做。弄清楚谁在保留大部分时间都不是真正有用的东西,并且可能有更好的方式去做你想要的事情。
答案 1 :(得分:6)
如果您只想调试某些内容,则可以覆盖其实例似乎卡在内存中的类的retain
方法。然后在overriden方法中设置断点,每次断点触发时,您都会看到堆栈上的保留器。