我的资源包中有100个图像,名为image1.jpg,image2.jpg。 基本上我要做的是在for循环中动态创建这些图像的路径名 在模拟器中测试时,图像加载正常,应用程序没有崩溃。但在使用仪器测试应用程序时,我惊讶地看到在创建path1对象时发生的大量内存泄漏。
I am pasting the entire method here for reference
- (id)init {
self = [super init];
if (self) {
self.arrayImages = [[[NSMutableArray alloc] init] autorelease];
for(int i=1 ; i<100 ; i++){
NSString *str = [NSString stringWithFormat:@"Century%d",i];
NSString *path1 = [[NSBundle mainBundle] pathForResource:str ofType:@"jpg"];
[self.arrayImages addObject:path1];
}
}
return self;
}
由于我没有在循环中使用任何alloc,我没有任何所有权,因此没有权利释放该对象。这个内存泄漏的原因是什么?
请解释问题并提供必要的解决方案以便解决问题。
与往常一样,任何帮助都受到高度赞赏..
答案 0 :(得分:3)
arrayImages
正在保留path1
,因此如果您不释放arrayImages
,它就会泄漏。你是如何创建arrayImages
的,并且是否在任何地方发布它?
根据评论编辑:
确保您在arrayImages
方法中发布-dealloc
,如下所示:[arrayImages release];
(请注意缺少self
)。
答案 1 :(得分:2)
您显示的代码中没有泄漏。
有(至少)两种可能性:
你的循环将创建许多自动释放的变量。直到循环结束后才会释放这些内容,但这就是它应该如何工作。
答案 2 :(得分:-1)
泄漏的原因就在这一行:
NSString *str = [NSString stringWithFormat:@"Century%d",i];
通过在Objective-C中使用便捷方法,后台会发生以下情况:
NSString *str = [[[NSString alloc] initWithFormat:@"Century%d", i] autorelease];
不使用alloc / init来创建弱引用是一种误解。无论您如何创建对象,您始终是已创建对象的所有者。方便的方法只是为您执行alloc / init和自动释放。
我建议你这样做以避免泄漏记忆:
- (id)init {
self = [super init];
if (self) {
self.arrayImages = [[[NSMutableArray alloc] init] autorelease];
NSAutoreleasePool *tmpPool = [[NSAutoreleasePool alloc] init];
for(int i = 1 ; i < 100 ; i++) {
NSString *str = [NSString stringWithFormat:@"Century%d",i];
NSString *path1 = [[NSString alloc] initWithString:[[NSBundle mainBundle] pathForResource:str ofType:@"jpg"]];
[self.arrayImages addObject:path1];
[path1 release];
}
[tmpPool drain];
}
return self;
}
请告诉我这是否适合您。
-EDIT-在添加到arrayImages后分配path1对象并释放它。