我是Objective-C的新手,我正在尝试实现一个扩展名为CCSprite的cocos2D类的'factory'样式类。
我希望有一个类Monster扩展CCSprite,它将创建和发布具有唯一ID的sprite,以便我可以稍后调用和操作生成的sprite;我正在扩展CCSprite以添加instance_id属性和静态global_id变量。
我希望能够使用所有CCSprite构造函数,例如spriteWithImageNamed以及CCSprite所具有的所有其他函数,问题是我的instance_id没有正确分配/递增(它始终为0),我不知道我真的知道从哪里开始解决这个问题。
这就是我所拥有的:
Monster.h:
#import "CCSprite.h"
@interface Monster : CCSprite
@property (nonatomic, readonly) int instance_id;
@end
Monster.m:
#import "Monster.h"
static int global_id = 0;
@implementation Monster:CCSprite
@synthesize instance_id;
-(id) init{
self = [super init];
if(self){
instance_id = global_id;
global_id++;
}
return self;
}
@end
每次调用任何构造函数时都调用init函数吗? (例如spriteWithImageNamed)?
当我调用父类的函数时,如何确保应用扩展属性和变量?
答案 0 :(得分:1)
在Objective-C中,类的指定初始化程序是其他初始化程序应该调用的程序。对于许多课程,这确实是init
。但是,根据Cocos2D文档,init
不是CCSprite的指定初始化程序。相反,指定的初始化程序是:
- (id)initWithTexture:(CCTexture *)texture rect:(CGRect)rect rotated:(BOOL)rotated
如果您希望所有其他初始化程序都调用您的版本,那么这是您需要覆盖的方法。
(如果你想自己确认这是有效的,你可以在你的指定初始化程序的实现中放置一个日志语句或断点,然后调用其他初始化程序并确保调用指定的初始化程序。)
答案 1 :(得分:0)
根据这些工厂方法在内部使用的init,可以调用或不调用init
方法。例如,initWithFile
可能会调用self = [super init]
而不是self = [self init]
,在这种情况下,您的实现将不会被调用。您可以确保始终通过覆盖所有超类的所有init方法来执行初始化,并进行必要的设置。还要记住,您还可以覆盖任何工厂方法,您可以从中调用super来获取对象,然后在返回之前分配它的id属性。
答案 2 :(得分:0)
看着CCSprite似乎每个工厂方法如+(id)spriteWith *都调用了一个initWith *方法
并且链末尾的每个initWith *方法都调用[self init]
所以,如果你像在monster.m中一样覆盖init方法,你就可以了!
顺便说一句,如果你想用工厂方法创建你的精灵,不要调用[CCSprite spriteWith *],而是调用[Monster spriteWith *]而不是
最好的问候