无法识别的选择器发送到实例错误?

Unrecognized selector sent to instance error?

考虑这段代码:

SCNNode *someNode = [[SCNNode alloc] init];
Piece *piece = (Piece *)someNode;
[piece pick];

其中 Piece 是 SCNNode 的子class,包含一个名为 pick 的方法。 Xcode 返回此错误:

[SCNNode pick]: unrecognized selector sent to instance

有人能告诉我我的代码有什么问题吗?

编辑:

我也试过了。同样的问题。

- (id)initPieceWithNode:(SCNNode *)node {

    if (self = [super init]) {
         self = (Piece *)[node copy];
    }

return self;
}

这里是将 SCNNode 转换为 Piece,而不是创建 Piece 对象。如果转换,该方法将不会神奇地出现在 SCNNode 中。

你应该这样做:

Piece *piece = [Piece pieceWithNode:someNode];

并举例:

+ (Piece *)pieceWithNode:(SCNNode *)aNode {
     Piece *newPiece = [Piece new];

     newPiece.property1 = aNode.propertyX
     newPiece.property2 = aNode.propertyY
     ...

     return newPiece;
}

这是最好的方法。

编辑 2: 根据评论:

Piece *piece = [Piece new]; 
[piece pick];

够了

如果PieceSCNNode的子类那么

   Piece *piece = [[Piece alloc] init];
   [piece pick];

如果您正在处理多态类型,那么您应该查询对象的确切类型并对该对象执行适合该类型的操作。

例如你有:

@interface SCNNode : NSObject
- (void)baseMethod;
@end

@interface Piece : SCNNode
- (void)derivedMethod;
@end

那么处理代码应该像这样:

- (void)doSomethingWithNode:(SCNNode *)node
{
    [node baseMethod];
    if ([node isKindOfClass:[Piece class]]) {
        [node derivedMethod];
    }
}

处理代码将基类型转换为派生类型是不合适的,因为我怀疑它是否能够提供对象的附加属性。如果您正在转换,那么其他地方有问题。