奇怪的NSObject到cocos2d随机初始化

时间:2012-10-31 16:40:37

标签: ios cocos2d-iphone nsarray nsdictionary nsobject

我有一个奇怪的问题。我正在创建一个降临节日历,作为圣诞节更新的一部分,并且我试图阻止两次同时获得相同的奖品(奖品在应用程序的其他地方使用)。

奖品列表存储在plist中,因为它似乎是输入/读取数据的快捷方式。

-(Prize*)getPrizeForDay:(NSInteger)integer
{
    NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"XmasPresents" ofType:@"plist"];
    NSArray* contentArray = (NSArray*)[NSArray arrayWithContentsOfFile:plistPath];
    NSDictionary* dictionary = (NSDictionary*)[contentArray objectAtIndex:integer-1];

Prize* prize = (Prize*)[Prize prizeWithType:[[dictionary objectForKey:@"ContentId"]intValue] andName:[dictionary objectForKey:@"Name"] andContent:[dictionary objectForKey:@"Content"] andAnswer:[dictionary objectForKey:@"Answer"]];

if(![self.calendarPrizes containsObject:prize])
[self.calendarPrizes addObject:prize];
else
    prize.unlocked = YES;

return prize;

}

self.calendarPrizes正在didFinishLaunching的app委托中初始化,如果它不存在并在退出时存储在NSUserDefaults中。这个函数在单例类中。

当再次运行该函数时出现奇怪的情况NSArray不再是NSArray,NSDictionary不再是字典而且奖品不再是奖品!它们都被初始化为随机Cocos2d对象。因此,奖品可以多次添加。

基本上帮助!

更新

此字符仅出现在iOS6中,今天早上在iOS 5测试设备上进行了测试,它按预期工作。

1 个答案:

答案 0 :(得分:0)

所以我发现[NSArray containsObject:]不能用于自定义对象。您要么必须在NSObject上覆盖isEqual方法,要么使用谓词(我选择了后者)。

 NSPredicate* predicate = [NSPredicate predicateWithFormat:@"name == %@",prize.name];
NSArray* predicateArray = [self.calendarPrizes filteredArrayUsingPredicate:predicate];

if(predicateArray.count > 0)
{
    prize.unlocked = YES;
}
else
{
    [self.calendarPrizes addObject:prize];
}

return prize;

奇怪的行为仍然存在,但它不再是一个问题,所以我现在继续前进,但知道为什么这些对象看起来是错误的类会很好。