这是带有自定义init方法的类:
// Piece.h
#import <Foundation/Foundation.h>
@interface Piece : CCSprite
@property (nonatomic) int pieceNumber;
+(Piece *)initWithPieceImage:(UIImage*)piece pieceName:(int)pName;
@end
// Piece.m
#import "Piece.h"
@implementation Piece
@synthesize pieceNumber = _pieceNumber;
+(id)initWithPieceImage:(UIImage *)piece pieceName:(int)pName
{
return [[[self alloc] initWithPieceImage:piece pieceName:pName] autorelease];
}
-(Piece*)initWithPieceImage:(UIImage *)piece pieceName:(int)pName
{
CCSprite *bgImage = nil;
if ( (self=[super init]) )
{
bgImage = [CCSprite spriteWithCGImage:piece.CGImage
key: [NSString stringWithFormat:@"%i",pName]];
}
return (Piece*)bgImage;
}
@end
我实例化了Piece类,将其添加到图层中:
Piece *newPiece = [Piece initWithPieceImage:myUIImage pieceName:1];
[newPiece setPieceNumber:2]; //Error in this line
[self addChild: newPiece z:1];
但是我已经这样尝试过了,并且效果很好:
Piece *newPiece = [[Piece alloc] init];
[newPiece setPieceNumber:2];
但这不是我想要的。
这是我得到的错误:
[CCSprite setPieceNumber:]:无法识别的选择器已发送到实例0x85f1050
由于未捕获的异常NSInvalidArgumentException而终止应用程序,原因:-[CCSprite setPieceNumber:]:无法识别的选择器已发送到实例0x85f1050
显然,问题似乎出在我是如何尝试初始化我的对象。
我是Objective-C的新手,所以我无法弄清楚这里出了什么问题。
我在这里做错什么的任何想法吗?
如何实现此方法并使用自定义init方法访问实例化对象的属性?
最佳答案
您的代码一团糟。在-(Piece*)initWithPieceImage:(UIImage *)piece pieceName:(int)pName
中,您将返回CCSprite
对象而不是Piece
。您为self
分配了一个对象,但返回了另一个类型不正确的对象。init
返回正确的类型(因为您没有重新实现它),因此它可以工作,但是您实际上尚未正确初始化图像。
您需要像这样更改方法:
-(Piece*)initWithPieceImage:(UIImage *)piece pieceName:(int)pName
{
return [super initWithCGImage:piece.CGImage key:[NSString stringWithFormat:@"%i",pName]];
}
关于ios - 使用我的自定义init方法访问实例化对象的属性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21948926/