仪器在for循环中使用NSbundle时会导致内存泄漏

时间:2011-11-02 06:36:15

标签: cocoa-touch xcode4 ios4

我试图删除我的应用程序中的内存泄漏但我发现在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]];

我在这里做错了什么......

1 个答案:

答案 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中的对象。

相关问题