2011-11-02 60 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

添加完整的代碼。 –