Objective c 返回某事物是其属性的对象?

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

在我看来,我必须测试层。在我得到图层之后,我需要得到图层作为属性的对象,或者“它所属的对象”。有没有办法归还房产的所有者


谢谢

一种方法是迭代对象,将图层属性与命中测试检索到的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。加莱尔人只做自己的小加莱尔事

    来自同一对象或多个不同对象的任意数量的属性所使用的多个不同实例变量都可以指向同一CALayer对象

    所以问题变成了:一个对象是否保留了一个指向它的所有变量的列表


    答案是:不幸的是,没有。

    我们这里有三种不同的东西:

  • 财产
  • 属性后面的实例变量
  • 炉匠
  • 这是三件截然不同的事情。该属性属于对象的类,并告诉编译器如何访问实例变量(如果我可以稍微手舞足蹈的话)。实例变量属于对象,并指向CALayer。加莱尔人只做自己的小加莱尔事

    来自同一对象或多个不同对象的任意数量的属性所使用的多个不同实例变量都可以指向同一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的属性。从设计和语言的角度来看,这都是完全可以的。在发布