NSDictionary теряет данные? - PullRequest
0 голосов
/ 26 июня 2011

Я видел сообщения, где 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];
}

1 Ответ

2 голосов
/ 27 июня 2011

Проверьте, устраняет ли проблема удаление пула автоматического выпуска.Насколько я понимаю, вам это не нужно, поскольку quadLibrary выглядит как iVar, а itemData автоматически выпускается его родительским классом, как и все TextureQuads вы вернетесь в свой цикл .

...