动态创建多个类实例

时间:2009-07-24 18:00:49

标签: iphone objective-c xcode

我的问题涉及2-4人可以玩的简单游戏。这是一款在iphone / ipod touch上播放的游戏,因此无需网络连接。当游戏开始时,用户将选择将要玩的玩家的数量。

对于我需要创建的每个玩家和Player类的实例。我的问题是我如何编码,以便只生成所需数量的类,并且它们都是不同的命名。我想到了以下但我知道这不起作用。

假设我有一个名为“playerNames”的数组,用于存储游戏中玩家的名字。

for (int i = 0; i < [playerNames count]; i++) {

     Player *playeri = [[Player alloc] init];

     //other code

}

我不能把“i”放在那里作为循环的计数器并得到四个名为player1,player2等的实例。我该怎么做?

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:2)

您无法动态创建变量实例 - 您需要一个集合来存储生成的玩家。 C-array或NSMutableArray可以正常工作。您可以将此集合添加到控制器或视图中,以便通过游戏访问玩家。

此外,您可能希望使用autorelease自动释放播放器,或者使用dealloc方法释放集合中的项目,以避免内存泄漏。

这是一些使用NSMutableArray的代码,我假设你会添加到你的类接口(并在某处初始化,通常在viewDidLoad中)

-(void) CreatePlayers:(int)playerCount
{
  for( int i = 0; i < [playerNames count]; i++ )
  {
      [playersArray insertObject:[[[Player alloc] init] autorelease] 
                         atIndex:i];
  }
}

答案 1 :(得分:0)

您无法以编程方式为变量命名。

但是,您可以创建这些对象并将它们添加到NSMutableArray中,然后稍后将其调出。

如果您确实想要将“PlayerN”名称与每个对象相关联,请使用NSMutableDictionary。将玩家对象存储为键值@“PlayerN”(NSString)。

创建密钥可以这样做:

NSString *key = [NSString stringWithFormat:@"Player%d", i];

答案 2 :(得分:0)

最基本的解决方案是将玩家存储在数组或字典中(以玩家名称为键)。采用阵列方法:

// assume we have an NSArray property, players
NSMutableArray *tempPlayers = [NSMutableArray arrayWithCapacity:[playerNames count]];
for (NSString *name in playerNames) {
  Player *player = [[Player alloc] init];
  [tempPlayers addObject:player];
  [player release];
}
self.players = tempPlayers;

现在,您可以通过拨打players来访问objectAtIndex:媒体资源中的每位玩家。

关于设计的一句话 - 首先,您考虑过在您的name课程中添加Player属性吗?在您捕获此信息后,这似乎是存储此信息的自然场所。例如:

for (NSString *name in playerNames) {
  // you might also have a designated initializer
  // e.g. [[Player alloc] initWithName:name]

  Player *player = [[Player alloc] init];
  player.name = name;
  [tempPlayers addObject:player];
  [player release];
}

总的来说,这是最简单的方法,也是我现在要做的。但是,将来......

在某些时候,您可能会发现自己会引入某种Game类来代表用户创建的每个新游戏。这将是存储您的玩家阵列的自然场所,并允许您构建更具凝聚力的界面,例如:

Game *newGame = [[Game alloc] init];
for(NSString *name) in playerNames) {
  [newGame addPlayerNamed:name];
}

您的Game类将封装玩家数组,addPlayerNamed方法将封装创建新Player并将其存储在该数组中的过程,使您的控制器代码更加简单(和意图揭露)在这个过程中。

这样做的另一个好处是它为您提供了一种能够在整个应用程序中访问此数据的方法,而不是将其绑定在此特定控制器中。您可以实现某种类似单身的访问“currentGame”。当然不是真正的单身人士,但这样的事情会很好:

Game *newGame = [[Game alloc init];
.. // configure game as above
[Game setCurrentGame:newGame];

现在,只要您需要访问当前游戏(或玩家)信息:

// in some other controller
Game *currentGame = [Game currentGame];
for(Player *player in currentGame.players) {
  // etc...
}
相关问题