【发布时间】:2011-06-26 17:10:30
【问题描述】:
我看过 NSDictionary 丢失数据的帖子,但在我的情况下它有点奇怪。我有一个包含一些数据的类,包括 NSString 和 NSIntegers 和 GLfloats。 (据我所知,所有这些都符合 NSCopying 不像 CGFloat 之类的东西。)
我在我的应用程序中快速访问文件并且一切正常,但随后我尝试再次访问它(以重新加载/刷新)屏幕,然后 NSInteger 值返回介于 180000 和数十亿之间的值知道肯定是 4 所以由于某种原因数据没有持久化。
感觉数据在某些时候丢失/释放/更改,但我不知道它怎么可能。
编辑:
这里有一些代码,这是创建和存储 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,宽度,高度。
编辑 3: 这是我从中加载对象的地方 我使用 [MaterialController sharedMaterialController] 来获取此控制器的实例
-(TexturedQuad *)quadFromAtlasKey:(NSString *)atlasKey
{
return [quadLibrary objectForKey:atlasKey];
}
【问题讨论】:
-
没有代码,没有人有太多机会帮助您。发布您正在谈论的内容的代码。
-
另外,您是否有任何理由制作自定义包装类而不是
NSValue? -
看起来实际数据来自您捆绑包中的
plist文件。你能告诉我们这些文件是什么样的吗? -
这看起来没什么问题。当您刷新屏幕时,您如何尝试“再次访问它”?
-
看起来你的
quadLibrary被保留了,应该没问题。
标签: ios objective-c iphone nsdictionary