我在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)?或者它没有保持索引在哪里,它填补空白?或者不断添加到最后没有移动任何东西?再次感谢。
答案 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"