Objective c 返回某事物是其属性的对象?
假设我有一个具有许多属性的对象,其中一个是CALayer 在我看来,我必须测试层。在我得到图层之后,我需要得到图层作为属性的对象,或者“它所属的对象”。有没有办法归还房产的所有者Objective c 返回某事物是其属性的对象?,objective-c,cocoa,Objective C,Cocoa,假设我有一个具有许多属性的对象,其中一个是CALayer 在我看来,我必须测试层。在我得到图层之后,我需要得到图层作为属性的对象,或者“它所属的对象”。有没有办法归还房产的所有者 谢谢 一种方法是迭代对象,将图层属性与命中测试检索到的CALayer进行比较: MyObject *theObject = nil; for ( MyObject *obj in self.objects ) { if ( obj.layer == theLayer ) { theObject
谢谢 一种方法是迭代对象,将图层属性与命中测试检索到的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进行子类化。一种方法是迭代对象,将层属性与通过命中测试检索的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进行子类化。我们这里有三个不同的东西:
答案是:不幸的是,没有。我们这里有三种不同的东西:
答案是:不幸的是,没有。我建议您在执行命中测试时,将
CALayer
的父层而不是实际的层传递给它,这样您就不需要备份到父层
除非实现双向关系,否则无法找到属性对象的父对象。这两种方式的关系通常都不好,因为它很容易引入保留循环
Cocoa中的一般解决方案是使用委托,结果是
CALayer
的委托是它所支持的UIView
。因此,对于大多数CALayer
实例,您可以通过委托备份到其父实例。请注意我说的大部分,而不是全部,因此这不是一个银弹。我建议您在进行命中测试时,绕过CALayer
的父级,而不是实际的层,这样您就不需要备份到父级
除非实现双向关系,否则无法找到属性对象的父对象。这两种方式的关系通常都不好,因为它很容易引入保留循环
Cocoa中的一般解决方案是使用委托,结果是
CALayer
的委托是它所支持的UIView
。因此,对于大多数CALayer
实例,您可以通过委托备份到其父实例。请注意,我说的是大多数,而不是全部,所以这不是一个灵丹妙药。子类化CALayer显然可以解决这个问题,但我在hitTesting方面遇到了一些问题:。假设我将CALayer子类化(称为spriteLayer)并为其提供两个BOOL属性,当我在视图的根层上调用hitTest并获取其中一个spriteLayer时,它将作为CALayer返回,因此当我尝试访问该层的BOOL属性时,我不能:'(…从设计角度来看,将这些bool作为层的属性是最干净的,所以我很想知道在这里该怎么做。有什么想法吗?你可以检查通过命中测试得到的层的类,如果是,比如说,SpriteLayer,你可以将指针投射到(SpriteLayer*)并且可以安全地访问特定于SpriteLayer的属性。从设计和语言角度来看,这都是完全可以的。请记住,在投射对象指针之前,您应该始终检查其类:if([obj class]==[SpriteLayer class])
,因为如果不这样做,则在发送对象消息时会导致崩溃。子类化CALayer显然可以解决此问题,但我在hitTesting方面遇到了一些问题:。假设我子类化CALayer(称为spriteLayer)给它两个BOOL属性,当我调用视图根层上的hitTest并获取其中一个spritelayer时,它将以CALayer的形式返回,所以当我尝试访问该层的BOOL属性时,我不能:'(…从设计角度来看,将这些bool作为层的属性是最干净的,所以我很想知道在这里该怎么做。有什么想法吗?你可以检查通过命中测试得到的层的类,如果是,比如说,SpriteLayer,你可以将指针投射到(SpriteLayer*)并且可以安全地访问特定于SpriteLayer的属性。从设计和语言的角度来看,这都是完全可以的。在发布