我试图删除我的应用程序中的内存泄漏但我发现在for循环中使用alloc NSbundle时它会给我内存泄漏。
这是我的代码: -
in my class myFeed.m
for(int i = 0; i<20; i++)
{
NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];
NSDictionary *temp = (NSDictionary*)[topData objectAtIndex:i];
NSString *iconName = [temp objectForKey:@"feed_source"];
NSString *imageName;
TimeLineGrid *grid = [[TimeLineGrid alloc]initWithNibName:@"TimeLineGrid" bundle:[NSBundle mainBundle]];
CGRect frame = grid.view.frame;
if([iconName isEqualToString:@"Youtube"])
imageName = [[NSBundle mainBundle]pathForResource:@"Youtube" ofType:@"png"];;
if (UIInterfaceOrientationIsLandscape(self.interfaceOrientation))
{
frame.size=CGSizeMake(130, 130);
}
else
{
frame.size = CGSizeMake(180, 180);
}
[grid setDelegate:self];
if (isConditionTrue)
{
x = x - 200 - topFactor;
}
else
x = x - frame.size.width;
if (x < 0)
{
x = 0;
}
frame.origin.x = x;
frame.origin.y = y;
grid.view.frame = frame;
grid.view.tag = tagCount;
if ([temp objectForKey:@"feed_item_nid"])
{
[tagToNIDMap addObject:[temp objectForKey:@"feed_item_nid"]];
}
if ([(NSString*)[temp objectForKey:@"feed_source"]isEqualToString:@"Youtube"])
{
[grid.webView loadHTMLString:[self getYoutubeCode:(NSString*)[temp objectForKey:@"feed_item_url"] :grid.webView.frame] baseURL:nil];
}
else
{
NSString * str = [[WebServiceController Initialize]parseHTMLData:[temp objectForKey:@"feed_item_body"] : @"//img"];
NSURL * url = [NSURL URLWithString:str];
NSURLRequest * req = [NSURLRequest requestWithURL:url];
[grid.webView loadRequest:req];
}
//[grid.view addSubview:grid.webView];
tagCount++;
[grid setHome:frame];
grid.dict = (NSDictionary*)[topData objectAtIndex:i];
// grid.icon.frame=CGRectMake(grid.view.frame.origin.x, grid.view.frame.origin.y-20,grid.icon.frame.size.width,grid.icon.frame.size.height)
grid.icon.image = [UIImage imageNamed:imageName];
grid.detail.text = [temp objectForKey:@"feed_item_title"];
[scroll1 addSubview:grid.view];
[imageName release];
[grid release];
[pool release];
}
}
myGrid是另一个带有.xib的类,我试图在myFeed类中加载它。
但如果在循环结束时添加[grid release]
,则可以看到myGrid的视图,但myGrid中的UiwebView不显示其数据。
并且该仪器还显示内存泄漏:
myGrid *grid = [[myGrid alloc]initWithNibName:@"myGrid" bundle:[NSBundle mainBundle]];
我在这里做错了什么......
答案 0 :(得分:0)
你并没有做所有myGrid
个对象(顺便说一下,类名应该以大写字母开头)。你的循环创建了一个视图控制器,将一些东西加载到它的webView
属性中,然后释放它,这是没有意义的。
我认为在这个循环结束后你正在用grid
做什么 - 这是什么?如果你真的需要20个不同的myGrid
对象,那么你需要在循环期间将它们添加到数组或其他东西,因为此时你只是在每次循环处理时覆盖grid
的值。如果删除release语句,那么在循环结束时将有一个myGrid
对象,而其他传递中有19个泄漏的实例。
如果你想要一个grid
对象,那么在循环开始之前创建它 - 但看起来这样最终会得到一个配置的对象,但是你在循环的最后一次迭代中设置它。
<强>更新强>
好的,现在你已经包含了完整的代码,它更清晰一点。您需要保留每个grid
对象。在for循环之前创建一个NSMutableArray(这应该是这个代码所在的任何对象的属性):
self.gridArray = [NSMutableArray array];
for (... // your loop here
在循环中,在释放网格之前,添加以下内容:
[self.gridArray addObject:grid];
[grid release];
这可以防止您丢失对除最后一个之外的每个grid
对象的引用,并阻止您在此代码中泄漏内存。您可以在以后根据需要发布或修改gridArray
中的对象。