Objective-C:如何判断哪个其他对象保留了特定对象?

时间:2009-09-26 18:25:44

标签: objective-c

在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%正确,但希望问题很明确。

2 个答案:

答案 0 :(得分:6)

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

如果您想跟踪谁保留对象,您需要自己动手。每次保留时,您都可以将自己添加到保留器列表中,例如保留对象内的NSArray

我不确切地知道你要做什么,但你几乎肯定会以错误的方式去做。弄清楚谁在保留大部分时间都不是真正有用的东西,并且可能有更好的方式去做你想要的事情。

答案 1 :(得分:6)

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

相关问题