传递自我作为参数

时间:2012-10-27 14:29:39

标签: objective-c object pointers parameters

我在Objective C上相当新,可能会因为我习惯使用C ++而感到困惑。我正在制作一款iphone游戏,我想要做的就是让所有敌人和英雄都“注册”并“取消注册”。我想将敌人和英雄的每个单独实例传递给这个单例类,然后将该对象添加到NSMutableArray,并能够在每个特定实例中调用函数和更改变量(通过使用基于其registerID的for循环)。当我试图传递一个敌人对象的指针并在论坛上查看时,我收到一个错误,它期望一个类型(在damagedistributer.h中),似乎没有人回答这个问题。我怎么能让这个工作?我不想要堆栈中对象的副本,所以当我更改变量时,我不会丢失这些更改。提前感谢。以下是一些代码:

DamageDistributer.h

@interface DamageDistributer : NSObject {

    GLuint enemyRegisterID;
    GLuint heroRegisterID;

    NSMutableArray *enemies;
    NSMutableArray *heros;
}

- (void)RegisterHero:(Player*)playerHero; //PROBLEM HERE
- (void)RegisterEnemy:(AbstractEnemy*)enemyUnit; //PROBLEM HERE 
- (void)Unregister:(GLuint)registerID type:(GLuint)typeOfEntity;

+ (DamageDistributer*)sharedDamageDistributer;

DamageDistributer.m

- (void)RegisterHero:(Player *)playerHero {

    [heros addObject:playerHero];
    playerHero.damageDistID = heroRegisterID;
    heroRegisterID++;
}

- (void)RegisterEnemy:(AbstractEnemy *)enemyUnit {

    [enemies addObject:enemyUnit];
    enemyUnit.damageDistID = enemyRegisterID;
    enemyRegisterID++;
}

- (void)Unregister:(GLuint)registerID type:(GLuint)typeOfEntity {

    if (typeOfEntity == hero) {
        [heros removeObjectAtIndex:registerID];
    }
    else {
        [enemies removeObjectAtIndex:registerID];
    }
}

然后这是来自敌人类的召唤

sharedDamageDistributer = [DamageDistributer sharedDamageDistributer];
[sharedDamageDistributer RegisterEnemy:self];

那么我做错了什么?

编辑: 哦,哇忽略了......谢谢你们,我以为它不止于此。还有一个问题。一旦从数组中删除了一个对象,可变数组是否会移动索引,所以我必须在移除一个对象之后减少所有对象(registerID)?或者它没有保持索引在哪里,它填补空白?或者不断添加到最后没有移动任何东西?再次感谢。

3 个答案:

答案 0 :(得分:3)

看起来标题不知道Player和AbstractEnemy。您可以导入这两个标头,或者只添加@class(前向声明),它告诉编译器有一个该名称的类。然后,您可以在DamageDistributer

的实现中导入这些标头
    @class Player;
    @class AbstractEnemy;
    @interface DamageDistributer : NSObject {

        GLuint enemyRegisterID;
        GLuint heroRegisterID;

        NSMutableArray *enemies;
        NSMutableArray *heros;
    }

    - (void)RegisterHero:(Player*)playerHero; //PROBLEM HERE
    - (void)RegisterEnemy:(AbstractEnemy*)enemyUnit; //PROBLEM HERE 
    - (void)Unregister:(GLuint)registerID type:(GLuint)typeOfEntity;

    + (DamageDistributer*)sharedDamageDistributer;

答案 1 :(得分:1)

我认为它不能识别标题中的自定义类。在.h文件中添加声明,例如:

@class Player;
@class AbstractEnemy;

答案 2 :(得分:1)

在objective-C中,所有内容(除了基本的c类型,如int,strict等)都在堆上。所有对象都在堆上,并使用引用计数(如智能指针)进行内存管理。

你的错误看起来与此无关,而且可能只是你没有#import "Player.h"