【问题标题】:Instrument gives Memory leak while using NSbundle in a for loopInstrument 在 for 循环中使用 NSbundle 时出现内存泄漏
【发布时间】:2011-11-02 06:36:15
【问题描述】:

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

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

【问题讨论】:

  • 你在哪里插入[grid release]?很有必要
  • 我已经添加了[网格发布]代码

标签: cocoa-touch xcode4 ios4


【解决方案1】:

你没有所有这些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 中的对象。

【讨论】:

  • 是的,如果我不发布网格,webView 中的数据将完美显示。当我点击网格时,它会显示一个 UIpopOver。我需要加载 20 个网格,因为我想要显示 20 个 youtube 视频缩略图,这样当我点击网格时,它会显示包含视频播放的弹出框。
  • 什么时候让网格可见?你能包括那个代码吗?
  • 感谢您的快速回复。我认为这非常有意义。给你+1
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-13
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多