如何从NSArray(iPhone)将NSNumbers转换为整数

时间:2011-06-10 19:51:14

标签: iphone objective-c nsarray

我有一款适用于iphone的游戏,其中32个按钮的标签至关重要。我试图创建一个功能,它将这32个整数保存到一个数组中,这样你就可以用相同的整数(标签)在棋盘上玩不同的游戏,然后以相同的方式用整数回到你的游戏。 (不要问多任务处理或类似的事情)有一些像这样的问题,但他们的答案似乎都没有用。

现在我有:

savedGame = [NSArray arrayWithObjects: [NSNumber numberWithInt:a2.tag], 
                 [NSNumber numberWithInt:a4.tag], 
                 [NSNumber numberWithInt:a6.tag], 
                 [NSNumber numberWithInt:a8.tag], 
                 [NSNumber numberWithInt:b1.tag], 
                 [NSNumber numberWithInt:b3.tag], 
                 [NSNumber numberWithInt:b5.tag], 
                 [NSNumber numberWithInt:b7.tag],
                 [NSNumber numberWithInt:c2.tag], 
                 [NSNumber numberWithInt:c4.tag],

一直到:

[NSNumber numberWithInt:h7.tag],nil];

用于保存游戏的部分

a2.tag = [((NSNumber*)[savedGame objectAtIndex:0]) intValue];

一直到:

h7.tag = [((NSNumber*)[savedGame objectAtIndex:32]) intValue];

在你恢复游戏的部分。然而,这个代码显然很糟糕,每当它在ios模拟器中获得此代码时,它会崩溃XCODE TOO(这会非常烦人,因为我需要强制退出并再次启动程序)(其xcode 4)

已保存的游戏在.h中创建,如:

NSArray *savedGame;

我想我必须添加一些内容来检查第二部分中是否有32个数字 - 所以如果你能在答案中加上那个很好的话 - 并提前感谢!我认为问题在于该代码的第二部分 -     g2.tag = [((NSNumber *)[savedGame objectAtIndex:25])intValue];

我也听说过NS Mutable 数组,所以也许这可以解决我的问题?

感谢您的帮助!而且我也对新方法 - 也许不是数组 - 持开放态度,可以解决这个问题!谢谢你提前!!!

4 个答案:

答案 0 :(得分:0)

改为使用NSMutableArray,您可以执行

之类的操作
[savedGame replaceObjectAtIndex:4 withObject:[NSNumber numberWithInt:a8.tag]];

您也可以在NSUserDefaults中保存这些:

NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setInteger:a4.tag forKey@"a4.tag"];
a4.tag = [prefs integerForKey:@"a4.tag"];

后一种方法还允许您使用for循环来设置和检索这些值。

答案 1 :(得分:0)

你应该真的使用NSDictionary来完成这项工作。 http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation/Classes/NSDictionary_Class/Reference/Reference.html 这将允许您使用密钥查询数据。

答案 2 :(得分:0)

如果您怀疑自己可以访问超出其大小的数组,那么您可以通过检查[savedGames count]来检查数组是否已获得您期望的对象数。 不知道是否有帮助。

作为一般性建议,我首先在调试模式下运行未修改的程序(如果你还没有这样做),并且可能在它失败的区域中逐步运行。所以你会确切地知道哪个是令人讨厌的陈述。

为了进一步尝试并了解正在发生的事情,我会将您的作业分成多行:

NSNumber* number = [savedGame objectAtIndex:0];
a2.tag = [number intValue];

如果在第一个语句上设置断点,则可以看到objectAtIndex返回的内容。 当然,我理解做出所有这些改变是一件大事。

作为一种替代方法,因为在我看来,对您而言重要的是ints(而不是NSNumbers,您只使用那些存储在某处的内容),您可以简单地求助使用longs的C数组。这样可以避免所有的来回转换。当然,我不确定你是否真的只对这些赌注感兴趣。

答案 3 :(得分:0)

嗯,根据你的标签的位置,我猜它有点像游戏的跳棋?因为你有一个64平方的网格,但只有一半的空间是可玩的。

至于你对可变数组的评论,可变数组只允许你动态地向数组中添加或删除对象。常规的NSArray具有固定的大小和组件(您无法添加或删除它)。所以你不需要使用可变数组来执行initWithObjects:部分。

但是,我真的认为你应该改变你这样做的方式。在这种情况下,您需要一个具有位置的对象。那你就可以做到

@interface GamePiece : NSObject
{
   CGPoint location; //an object with an x and y
}

@property (assign, readwrite) CGPoint location;

-(void)saveTheGame {
   [self setSavedGame:[[[NSMutableArray alloc] init] autorelease]];
   for(GamePiece *piece in allPieces)
   {
      [savedGame addObject:piece]
   }
}

然后在loadGame

if([savedGame count] == 32)
{
   [self setAllPieces:nil]; //allPieces is an array object of a "Game" that contains 
                            //references to all the pieces on the board

   for(GamePiece *piece in savedGame)
   {
       [allPieces addObject:piece];
   }
}