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

时间:2015-04-17 13:39:35

标签: ios objective-c oop scenekit

考虑以下代码:

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

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

[SCNNode pick]: unrecognized selector sent to instance

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

修改

我也试过这个。同样的问题。

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

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

return self;
}

3 个答案:

答案 0 :(得分:1)

在这里,您将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];

这是完全的

答案 1 :(得分:1)

如果PieceSCNNode的子类,那么

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

答案 2 :(得分:0)

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

例如,你有:

@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];
    }
}

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