我有一款适用于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 数组,所以也许这可以解决我的问题?
感谢您的帮助!而且我也对新方法 - 也许不是数组 - 持开放态度,可以解决这个问题!谢谢你提前!!!
答案 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)
至于你对可变数组的评论,可变数组只允许你动态地向数组中添加或删除对象。常规的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];
}
}