Ios 通过在类别中添加属性向类添加属性时,获取;无法识别的选择器…”;

Ios 通过在类别中添加属性向类添加属性时,获取;无法识别的选择器…”;,ios,objective-c,xcode,objective-c-category,Ios,Objective C,Xcode,Objective C Category,我尝试在SKSpriteNode上进行扩展,并尝试了几种方法(通过在新类中建立关系,通过直接扩展关系),最后我想尝试使用类别进行扩展。因此,我使用助手在XCode中以正确的方式创建了一个类别,并选择SKSpriteNode作为该类别的类。我在现有类的基础上进行了扩展,创建了一个新文件,其中包含名为SKSpriteNode+StaticLevelElement.h和SKSpriteNode+StaticLevelElement.m的其他方法和属性。由于某些原因,我无法添加属性。我试过了 为类别的.

我尝试在SKSpriteNode上进行扩展,并尝试了几种方法(通过在新类中建立关系,通过直接扩展关系),最后我想尝试使用类别进行扩展。因此,我使用助手在XCode中以正确的方式创建了一个类别,并选择SKSpriteNode作为该类别的类。我在现有类的基础上进行了扩展,创建了一个新文件,其中包含名为SKSpriteNode+StaticLevelElement.h和SKSpriteNode+StaticLevelElement.m的其他方法和属性。由于某些原因,我无法添加属性。我试过了

  • 为类别的.m文件中的新属性添加setter和getter方法,仍然会收到消息“unrecognized selector sent to instance”

  • 在category实现中的每个新属性前面添加@dynamic,结果与上面相同

  • 尝试在生成设置中设置其他链接器标志,得到与上面相同的结果

  • 尝试使用关联对象(),结果相同

  • 有什么建议吗?我很喜欢使用类别,但我仍然不想放弃,因为我看到它们有多酷,在XCode visual editor中使用精灵,不仅可以编程,而且可以很容易地直接看到结果,而且不必扩展类,也不必编程地做每件事,并希望有一个良好的外观和感觉的游戏

    相关代码:

    //  SKSpriteNode+StaticLevelElement.m
    #import <objc/runtime.h>
    #import "SKSpriteNode+StaticLevelElement.h"
    
    NSString * const gamePlayLogicSelector = @"gamePlayLogic";
    NSString * const pseudoDepthSelector = @"pseudoDepth";
    
    @implementation SKSpriteNode (StaticLevelElement)
    
    @dynamic gamePlayLogic;
    @dynamic pseudoDepth;
    @dynamic theName;
    @dynamic gameScene;
    
    
    - (void)setPseudoDepth:(float)pd
    {
        objc_setAssociatedObject(self, (__bridge const void *)(pseudoDepthSelector), pd, OBJC_ASSOCIATION_COPY);
    }
    
    //SKSpriteNode+StaticLevelElement.m
    #进口
    #导入“SKSpriteNode+StaticLevelElement.h”
    NSString*常量gamePlayLogicSelector=@“gamePlayLogic”;
    NSString*const pseudoDepthSelector=@“pseudoDepth”;
    @实现SKSpriteNode(StaticLevelElement)
    @动态游戏逻辑;
    @动态伪深度;
    @动态名称;
    @动态游戏场景;
    -(无效)设置伪深度:(浮动)pd
    {
    objc_setAssociatedObject(self,(uu bridge const void*)(伪深度选择器),pd,objc_ASSOCIATION_COPY);
    }
    
    最后一行导致错误“将'float'传递给不兼容类型'id'的参数”


    我这里缺少什么?

    关联对象是正确的方法。您应该添加显示您尝试的代码。同意w/@dan;还有关联策略(objc\u setAssociatedObject()的最后一个参数)可能应该是
    OBJC\u ASSOCIATION\u RETAIN\u NONATOMIC
    而不是
    OBJC\u ASSOCIATION\u COPY
    ,但是YMMV;您应该仔细阅读一下该参数,以确保获得适合您的情况的正确语义。实际上,我将float属性切换为NSNumber,根据相关对象的教程,它现在似乎可以工作了。现在另一个问题出现了,其他一些SKSpriteNode-s刚刚消失,我记录了它们,它们似乎存在,但大小为0,0…..这些对象也添加到场景编辑器的可视化编辑器中。更改为
    NSNumber
    会起作用,因为您使用的是关联对象,这是一种对象类型。但是
    float
    是一种值类型或POD(普通旧数据类型)在C-ese中,而不是对象。至于你的另一个问题,听起来你需要问一个新问题。HTHSo你刚才提出了和我一样的问题。如何将POD属性添加到类别中?对此有什么建议吗?谢谢!关联对象是正确的方法。你应该添加显示你尝试的代码。同意w/@dan;还有,As关联策略(objc\u setAssociatedObject()的最后一个参数)可能应该是
    OBJC\u ASSOCIATION\u RETAIN\u NONATOMIC
    而不是
    OBJC\u ASSOCIATION\u COPY
    ,但是YMMV;您应该仔细阅读一下该参数,以确保获得适合您的情况的正确语义。实际上,我将float属性切换为NSNumber,根据相关对象的教程,它现在似乎可以工作了。现在另一个问题出现了,其他一些SKSpriteNode-s刚刚消失,我记录了它们,它们似乎存在,但大小为0,0…..这些对象也添加到场景编辑器的可视化编辑器中。更改为
    NSNumber
    会起作用,因为您使用的是关联对象,这是一种对象类型。但是
    float
    是一种值类型或POD(纯旧数据类型)而不是对象。至于您的另一个问题,听起来您需要问一个新问题。HTHSo您刚才提出了与我相同的问题。如何将POD属性添加到类别?对此有任何建议吗?谢谢!