无法识别的选择器发送到实例错误?
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];
够了
如果Piece
是SCNNode
的子类那么
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];
}
}
处理代码将基类型转换为派生类型是不合适的,因为我怀疑它是否能够提供对象的附加属性。如果您正在转换,那么其他地方有问题。
考虑这段代码:
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];
够了
如果Piece
是SCNNode
的子类那么
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];
}
}
处理代码将基类型转换为派生类型是不合适的,因为我怀疑它是否能够提供对象的附加属性。如果您正在转换,那么其他地方有问题。