Инструмент дает утечку памяти при использовании NSbundle в цикле for - PullRequest
0 голосов
/ 02 ноября 2011

Я пытался устранить утечки памяти в моем приложении, но я обнаружил, что при использовании alloc NSbundle в цикле for он вызывает утечку памяти.

вот мой код: -

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, но UiwebView, присутствующий в myGrid, не показывает его данные.И прибор также показывает утечку памяти в строке:

myGrid *grid = [[myGrid alloc]initWithNibName:@"myGrid" bundle:[NSBundle mainBundle]];

что я здесь не так делаю ...

1 Ответ

0 голосов
/ 02 ноября 2011

Вы не ничего не делаете со всеми этими myGrid объектами (кстати, имена классов должны начинаться с заглавной буквы). Ваш цикл создает контроллер представления, загружает что-то в его свойство webView, а затем освобождает его, что бессмысленно.

Я полагаю, что вы что-то делаете с grid после завершения цикла - что это? Если вам действительно нужно 20 различных myGrid объектов, то вам нужно добавить их в массив или что-то во время цикла, потому что в данный момент вы просто перезаписываете значение grid каждый раз, когда ваш цикл обрабатывается. Если вы удалите оператор release, то у вас будет один myGrid объект в конце цикла и 19 пропущенных экземпляров из других проходов.

Если вам нужен один grid объект, то создайте его до начала цикла - но похоже, что он просто получит один объект, который настроен, как бы вы его ни устанавливали во время последней итерации цикла.

UPDATE

ОК, теперь вы включили свой полный код, это немного понятнее. Вы должны держать вокруг каждого grid объекта. Создайте NSMutableArray перед вашим циклом for (вероятно, это должно быть свойство любого объекта, в котором находится этот код):

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

В цикле, перед тем как освободить сетку, добавьте следующее:

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

Это предотвращает потерю ссылки на каждый grid объект, кроме последнего, и предотвращает утечку памяти в этом коде. Позже вы можете освободить или изменить объекты в вашем gridArray по своему усмотрению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...