假设我有一个具有许多属性的对象,其中一个属性是CALayer。
纵观我的观点,我必须点击测试图层。在我获得图层之后,我需要获取图层是属性的对象,或者“它属于哪个”。无论如何要归还财产的所有者吗?
谢谢!
答案 0 :(得分:4)
我们在这里有三个不同的东西:
这是三个截然不同的事情。该属性属于对象的类,并告诉编译器如何访问实例变量(如果我可以有点手工波浪)。实例变量属于该对象,并指向CALayer。而CALayer只是做了自己的小CALayer事。
来自同一对象或许多不同对象的任意数量属性使用的几个不同实例变量都可以指向同一个CALayer对象。
所以问题就变成了:对象是否保留了指向它的所有变量的列表?
答案是:不幸的是,没有。
答案 1 :(得分:2)
一种方法是迭代对象,将图层属性与点击测试检索到的CALayer进行比较:
MyObject *theObject = nil;
for ( MyObject *obj in self.objects ) {
if ( obj.layer == theLayer ) {
theObject = obj;
break;
}
}
另一种方法是子类化CALayer并添加指向它所代表的对象的ivar / property。为了避免保留周期,它应该是@property(assign) MyObject* representedObject
。它使对象变得微不足道,但需要继承CALayer。
答案 2 :(得分:2)
我建议你在进行点击测试时绕过CALayer
的父母而不是实际的图层,这样你就不需要备份到父母了。
除非您实现了双向关系,否则无法找到属性对象的父级。双向关系通常很糟糕,因为它很容易引入保留周期。
Cocoa的一般解决方案是使用委托,结果是CALayer
的委托是它支持的UIView
。因此,对于大多数CALayer
个实例,您可以通过委托备份到它的父级。请注意我说的最多,不是全部,所以它不是银弹。