我发现了一个奇怪的事情 - CCTexture2D
对象在使用addImageAsync:(NSString*)path withBlock:(void(^)(CCTexture2D *tex))block
或-(void) addImageAsync: (NSString*)path target:(id)target selector:(SEL)selector
异步加载时会被保留。
为了验证这一点,我创建了一个非常简单的项目。实际上这是cocos2d
模板。我有两个按钮,一个png文件mytexture.png
和一个打印以兆字节为单位的内存消耗的函数。这是功能:
void report_memory(void) {
struct task_basic_info info;
mach_msg_type_number_t size = sizeof(info);
kern_return_t kerr = task_info(mach_task_self(),
TASK_BASIC_INFO,
(task_info_t)&info,
&size);
if( kerr == KERN_SUCCESS ) {
NSLog(@"Memory : %f", info.resident_size / 1024.0f / 1024.0f);
} else {
NSLog(@"Error with task_info(): %s", mach_error_string(kerr));
}
}
虽然没有任何反应,只显示cocos2d
图层,但内存大约为8 MB(在iPad上)。我们点击第一个按钮:
[[CCTextureCache sharedTextureCache] addImageAsync:@"mytexture.png" withBlock:^(CCTexture2D *text){
NSLog(@"Cache %@", [CCTextureCache sharedTextureCache]);
}];
现在内存大约是24 MB。好。让我们点击第二个:
[[CCTextureCache sharedTextureCache] removeTextureForKey:@"mytexture.png"];
NSLog(@"Cache %@", [CCTextureCache sharedTextureCache]);
并且内存仍然是24 MB!为什么???唯一引用纹理的对象是缓存,但它已将其删除。它为什么还在记忆中?什么引用它?如果我使用addImage:
方法添加纹理,它会像我期望的那样被删除。那么如何解决呢?如何从内存中卸载?
如果您认为内存检查功能可以提供虚假数据,那么我想说我已经使用Instruments对应用程序进行了分析,结果显示相同。
答案 0 :(得分:1)
更喜欢使用Instruments测量内存使用情况。
至于实际问题: