Я видел сообщения, где NSDictionary теряет данные, но в моем случае это немного странно. У меня есть класс, который включает в себя некоторые данные, включая NSString и NSIntegers и GLfloats. (Насколько я знаю, все они соответствуют NSCopying в отличие от таких вещей, как CGFloat.)
Я быстро получаю доступ к файлам в моем приложении, и все это работает, но затем я пытаюсь снова получить к нему доступ (для перезагрузки / обновления) экрана, а затем значения NSInteger возвращают что-то между 180000 и несколькими миллиардами для значения I знаю, безусловно, 4, поэтому по какой-то причине данные не сохранились.
Такое ощущение, что данные в какой-то момент теряются / высвобождаются / изменяются, но я не знаю, как это возможно.
Edit:
Вот часть кода, здесь создаются и хранятся текстурированные Квады, метод вызывается для каждого атласа, который у меня есть в методе инициализации
Кроме того, я изменил, где я неправильно использовал оболочку слова
-(void)loadAtlasData:(NSString *)atlasName
{
NSAutoreleasePool *apool = [[NSAutoreleasePool alloc] init];
if (quadLibrary == nil)
quadLibrary = [[NSMutableDictionary alloc] init];
CGSize atlasSize = [self loadTextureImage:[atlasName
stringByAppendingPathExtension:@"png"]
materialKey:atlasName];
NSArray *itemData = [NSArray arrayWithContentsOfFile:[[NSBundle mainBundle] pathForResource:atlasName ofType:@"plist"]];
for(NSDictionary *record in itemData)
{
TexturedQuad *quad = [self texturedQuadFromAtlasRecord:record
atlasSize:atlasSize
materialKey:atlasName];
[quadLibrary setObject:quad forKey:
[record objectForKey:@"name"]];
}
[apool release];
}
-(TexturedQuad *)texturedQuadFromAtlasRecord:(NSDictionary *)record
atlasSize:(CGSize)atlasSize
materialKey:(NSString *)key
{
TexturedQuad *quad = [[TexturedQuad alloc] init];
GLfloat xLocation = [[record objectForKey:@"xLocation"] floatValue];
GLfloat yLocation = [[record objectForKey:@"yLocation"] floatValue];
GLfloat width = [[record objectForKey:@"width"] floatValue];
GLfloat height = [[record objectForKey:@"height"] floatValue];
//find the normalized texture co-ordinates
GLfloat uMin = xLocation/atlasSize.width;
GLfloat vMin = yLocation/atlasSize.height;
GLfloat uMax = (xLocation + width)/atlasSize.width;
GLfloat vMax = (yLocation + height)/atlasSize.height;
quad.uvCoordinates[0] = uMin;
quad.uvCoordinates[1] = vMax;
quad.uvCoordinates[2] = uMax;
quad.uvCoordinates[3] = vMax;
quad.uvCoordinates[4] = uMin;
quad.uvCoordinates[5] = vMin;
quad.uvCoordinates[6] = uMax;
quad.uvCoordinates[7] = vMin;
quad.materialKey = key;
return [quad autorelease];
}
Второе редактирование:
Добавлен пример файла plist
dict
(key)name
(string)sync
(key)xLocation
(integer)489
(key)yLocation
(integer)36
(key)width
(integer)21
(key)height
(integer)21
/dict
по сути это массив, состоящий из словарей, каждый словарь содержит данные для картинки в атласе. поэтому есть имя, xLocation, yLocation, ширина, высота.
изменить 3:
Здесь я загружаю объект
Я использую [MaterialController sharedMaterialController], чтобы получить экземпляр этого контроллера
-(TexturedQuad *)quadFromAtlasKey:(NSString *)atlasKey
{
return [quadLibrary objectForKey:atlasKey];
}