这是带有自定义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/

10-13 05:42