首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >动态创建多个类实例

动态创建多个类实例
EN

Stack Overflow用户
提问于 2009-07-24 18:00:49
回答 3查看 501关注 0票数 0

我的问题涉及一个简单的游戏,2-4个人可以玩。这是一个在iphone/ipod touch上玩的游戏,所以不需要联网。当游戏开始时,用户将选择将玩的玩家的数量。

对于每个player,我需要创建Player类的实例。我的问题是,我如何编写代码,以便只生成所需数量的类,并且它们都以不同的名称命名。我想到了以下几点,但我知道这是行不通的。

假设我有一个名为"playerNames“的数组,它存储了游戏中玩家的名字。

代码语言:javascript
复制
for (int i = 0; i < [playerNames count]; i++) {

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

     //other code

}

我不能只是把"i“放在里面作为循环的计数器,然后得到四个名为player1,player2等的实例。我该怎么做呢?

提前感谢您的帮助。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-07-24 18:09:41

您不能动态创建变量实例-您需要一个集合来存储生成的播放器。C数组或NSMutableArray会工作得很好。您可以将此集合添加到您的控制器或视图中,以便玩家可以通过游戏进行访问。

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

下面是一些使用NSMutableArray的代码,我假设您会将其添加到类接口中(并在某个地方进行初始化,通常是在viewDidLoad中)

代码语言:javascript
复制
-(void) CreatePlayers:(int)playerCount
{
  for( int i = 0; i < [playerNames count]; i++ )
  {
      [playersArray insertObject:[[[Player alloc] init] autorelease] 
                         atIndex:i];
  }
}
票数 2
EN

Stack Overflow用户

发布于 2009-07-24 18:10:10

您不能完全以编程方式命名您的变量。

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

如果您确实希望将"PlayerN“名称与每个对象相关联,请使用NSMutableDictionary。将播放器对象存储为键@"PlayerN“(一个NSString)的值。

可以像这样创建密钥:

代码语言:javascript
复制
NSString *key = [NSString stringWithFormat:@"Player%d", i];
票数 0
EN

Stack Overflow用户

发布于 2009-07-24 18:15:13

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

代码语言:javascript
复制
// 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;

现在可以通过调用objectAtIndex:players属性访问每个播放器。

关于设计--首先,您是否考虑过在Player类中添加name属性?在捕获这些信息之后,这似乎是一个很自然的存储位置。例如:

代码语言:javascript
复制
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类来表示用户创建的每个新游戏。这将是存储您的播放器数组的一个自然位置,并允许您构建一个更有凝聚力的界面,例如:

代码语言:javascript
复制
Game *newGame = [[Game alloc] init];
for(NSString *name) in playerNames) {
  [newGame addPlayerNamed:name];
}

您的Game类将封装播放器数组,而addPlayerNamed方法将封装创建新Player并将其存储在该数组中的过程,从而使您的控制器代码在该过程中变得更加简单(并揭示意图)。

这样做的另一个好处是,它为您提供了一种在整个应用程序中访问这些数据的方法,而不是将其捆绑在这个特定的控制器中。您可以实现对"currentGame“的某种类似单例的访问。当然,这不是一个真正的单例,但类似这样的代码将会很好地工作:

代码语言:javascript
复制
Game *newGame = [[Game alloc init];
.. // configure game as above
[Game setCurrentGame:newGame];

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

代码语言:javascript
复制
// in some other controller
Game *currentGame = [Game currentGame];
for(Player *player in currentGame.players) {
  // etc...
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1179211

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档