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

标签 objective-c

在 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/

相关文章:

ios - 如何制作自定义 UITableViewCell 的父类(super class)?

objective-c - 如何在 OSX 上防止消息对话框 "myapp wants to sign using privateKey ..."?

ios - 将对象检测模型嵌入到 iOS 应用程序中,并将其部署在 UIView 的内容而不是相机流上?

objective-c - 为什么这个内联汇编调用libobjc中的release、retain和autorelease?

objective-c - 如何在 Mac OS X Lion 上双屏显示

objective-c - 如何防止 UIScrollView 拦截它自己的 View 层次结构之外的触摸?

iphone - 尝试从祖鲁时间的 UTC 字符串获取日期时为 Nil NSDate

iphone - 后台服务是 "allowed to continue running while in the background"。那为什么我不能让它工作呢?

objective-c - 使应用程序与以前的 iOS 版本兼容

ios - 将默认的 interactivePopGestureRecognizer 扩展到屏幕边缘之外?