我看到过NSDictionary丢失数据的帖子,但在我看来,这有点儿困惑。我有一个包含一些数据的类,包括NSString和NSIntegers和GLfloats。 (据我所知,所有这些都确实符合NSCopying,与CGFloat之类的东西不同。)

我在我的应用程序中快速访问了文件,并且一切正常,但是随后我尝试再次访问它(以重新加载/刷新)屏幕,然后NSInteger值返回180000到几十亿之间的某个值,我知道该值肯定是4,因此由于某种原因数据没有持久。

感觉好像数据在某个时候丢失/释放/更改,但我不知道它怎么可能。

编辑:

这是一些代码,这是创建并存储TexturedQuad的地方,该方法针对init方法中的每个图集进行调用

我也改变了滥用包装纸的地方

-(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];
}

最佳答案

查看删除自动释放池是否解决了该问题。据我所知,您不需要它,因为quadLibrary似乎是一个iVar,而itemData是由其父类自动释放的,因此您在for循环中返回的所有TextureQuad也是如此。

关于ios - NSDictionary丢失数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6485412/

10-11 14:51
查看更多