初学者目标-C:扩展课程?

时间:2014-07-16 23:39:53

标签: objective-c inheritance cocos2d-iphone extend ccsprite

我是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)?

当我调用父类的函数时,如何确保应用扩展属性和变量?

3 个答案:

答案 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 *]而不是

最好的问候