2011-11-02 71 views
0

我试图删除我的应用程序中的内存泄漏,但我发现在for循环中使用alloc NSbundle时,它给我内存泄漏。仪器在for循环中使用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

你在哪里插入'[grid release]'?这是需要的 – Nekto

+0

我已经添加了[网格发布]代码 –

回答

0

你是不是任何与所有那些myGrid对象(类名称应顺便说一句,以大写字母开头)。你的循环创建一个视图控制器,加载一些东西到它的webView属性中,然后释放它,这是毫无意义的。

我假设你在循环完成后正在做grid - 那是什么?如果你真的需要20个不同的对象,那么你需要在循环中将它们添加到数组或类似的东西中,因为此时每次循环处理时只覆盖grid的值。如果删除发布声明,则循环结束时将有一个对象myGrid,并且其他通道将有19个泄露实例。

如果你想要一个单一的grid对象,然后在循环开始之前创建它 - 但它看起来像只会结束一个配置的单个对象,然而您在循环的最后一次迭代过程中设置了它。

UPDATE

OK,现在你已经包含完整的代码实在是有点清晰。您需要保留每个grid对象。你的for循环之前创建一个NSMutableArray(这可能应该是任何对象的代码是一个属性):

self.gridArray = [NSMutableArray array]; 
for (... // your loop here 

在循环中,你放开格之前,添加以下内容:

[self.gridArray addObject:grid]; 
[grid release]; 

这可以防止您丢失除最后一个对象之外的每个对象grid的引用,并阻止您在此代码中泄漏内存。如果您认为合适,您可以稍后释放或修改您的gridArray中的对象。

+0

是的,如果我不释放网格,webView中的数据显示完美。当我点击网格时,它会显示一个UIpopOver。我需要加载20个网格,因为我想要显示20个YouTube视频缩略图,以便当我点击网格时,它会向我显示播放视频的弹出窗口。 –

+0

你什么时候可以看到网格?你可以包含该代码吗? – jrturton

+0

添加完整的代码。 –