2011-06-26 5 views
0

私はNSDictionaryがデータを失うポストを見たことがありますが、私の場合は少し悲しいです。 NSString、NSIntegers、GLfloatsなどのデータを含むクラスがあります。 (これらのすべてがCGFloatのようなものとは異なり、NSCopyingに準拠しています)NSDictionaryがデータを失う?

私のアプリケーションでファイルにすばやくアクセスしていますが、すべて動作しますが、再度アクセスしようとします画面とNSIntegerの値は180000から何かを返します。私が知っている値は確かに4ですから何らかの理由でデータが残っていません。

ある時点でデータが失われたり解放されたりしているように感じますが、どうすれば可能かはわかりません。

編集:

HERESにコードの一部、texturedQuadsを作成して保存されている場合、これは、方法は、各アトラスのために呼ばれている私は誤用ところ私は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、width、heightがあります。

編集3:私は自動解放プールを削除すると、問題をソートするかどうかを確認し、このコントローラ

-(TexturedQuad *)quadFromAtlasKey:(NSString *)atlasKey 
{ 
    return [quadLibrary objectForKey:atlasKey]; 
} 
+3

誰もコードなしであなたを助けるチャンスがありません。あなたが話していることのための郵便番号。 –

+1

また、 'NSValue'ではなくカスタムラッパークラスを作成する理由はありますか? – jtbandes

+0

私はラッパーを使用することを意図していたが、テクスチャ付きクワッドを格納していたのかどうかは分かりません。残念ながら、NSIntegersをたくさん格納しています。 – MPainter

答えて

2

のインスタンスを取得するには、[MaterialController sharedMaterialController]を使用 からオブジェクトをロードするのはここ です。 quadLibraryがITEMDATAながらイヴァーであるように思わ限り、私は見ることができるようにあなたはそれを必要としないすべてのTextureQuadsはあなたがループのためにあなたのに返しているように、自動解放その親クラスです。

+0

ありがとう、私は、私が作成したクワッドを取り除くための自動解放プールを置いたと思います。(辞書に追加したときに私の知識がコピーされたときのように)メモリを浪費しませんでした。 – MPainter

関連する問題