Сохранение счета проблемы iphone SDK - PullRequest
0 голосов
/ 10 июня 2010

Я сталкиваюсь с проблемой утечки памяти, которая выглядит следующим образом:

  1. Я выделяю объект класса A в классе B. // СОХРАНИТЬ СЧЕТЧИК КЛАССА A ОБЪЕКТ СТАНЕТ1

  2. Я помещаю объект в массив nsmutablearray.// ОСТАВЛЯЕМСЯ СЧЕТЧИК КЛАССА, ОБЪЕКТ СТАНЕТ 2

  3. В другом классе C я беру этот nsmutablearray, выбирая все элементы, такие как

    for(NSInteger f=0; f< [appDelegate.category_type count]; f++)
    {
    [category_type addObject:[appDelegate.category_type objectAtIndex:f]];
    }
    

    влокальный массив nsmutable, освобождающий этот первый массив класса B, т. е. appDelegate.category_type.
    // СОХРАНЕНИЕ ОБЪЕКТА КЛАССА A В МЕСТНОМ Массиве [category_type] СТАТЬ 1

  4. Теперь в этомкласс C, я создаю объект класса A и извлекаю элементы в локальном массиве nsmutablearray, например:

     A *a = [[A alloc]init]; 
     a = [category_type objectAtIndex:i];       
    

    // ОСТАВЛЯЕМСЯ СЧЕТЧИКОМ СТАВКИ 2 [ALLOCATION + FETCHED OBJECT WITH RETAIN COUNT 1]

Мой вопрос заключается в том, что я хочу сохранить этот массив category_type, который я отображаю в табличном представлении, и хочу освободить его после заполнения новых элементов в массиве, который я делаю в классе BПоэтому, прежде чем добавлять новые элементы, я удаляю все элементы в классе B и делаю их равными nil, поэтому ссылки на a теперь равны 0. А в классе C я освобождаю a в dealloc.

Но вПриборы-> LЭто показывает, что я обнаружил утечку для этого объекта класса A в классе C.

Может кто-нибудь сказать мне, где я ошибаюсь.

Спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 10 июня 2010

Я пытаюсь понять вашу проблему, вот что, я думаю, вы говорите:

1.

A *a = [[A alloc] init];

2.

[category_type addObject:a];

3.

for(NSInteger f=0; f< [appDelegate.category_type count]; f++)
    [category_type addObject:[appDelegate.category_type objectAtIndex:f]];

4.

A *a = [category_type objectAtIndex:i];

Вы должны рассказать нам больше о том, где вы выпускаете объекты - в (3) вы говорите, что «выпускаете этот первый массив класса B» - можете ли вы показать нам код?

Похоже, что вы сохраняете объект 3 раза, но не опубликовали никакого кода, чтобы показать, что он вообще освобождается.


Я думаю, что вам нужно сделать что-то более подобное:

1 & 2. (в классе B)

A *a = [[[A alloc] init] autorelease];

[category_type release];
category_type = [NSMutableArray alloc] init];
[category_type addObject:a];

3.(в классе C)

[category_type release];
category_type = [[NSArray arrayWithArray:appDelegate.category_type] retain];

4.

A *a = [category_type objectAtIndex:i];

(как в классе B, так и в методе dealloc C)

[release_type category];

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

0 голосов
/ 10 июня 2010

Я размещаю объект класса A в классе B. // СОХРАНЕНИЕ СЧЕТА КЛАССА A ОБЪЕКТ СТАНЕТ 1

Я помещаю объект в массив nsmutablearray. // СОХРАНИТЬ СЧЕТ КЛАССА, ОБЪЕКТ СТАНЕТ 2

В другом классе C я собираю этот nsmutablearray, выбирая все элементы этого массива в локальном nsmutablearray, // КАК R U FETCHING ???

освобождение этого первого массива класса B. // СОХРАНЕНИЕ ОБЪЕКТА КЛАССА A ОБЪЕКТОВ В МЕСТНОМ Массиве становится 1

Теперь в этом классе C я создаю объект класса A и извлекаю элементы из локального nsmutable массива. // СОХРАНЕНИЕ СЧЕТА НОВОГО КЛАССА ОБЪЕКТ В МЕСТНОМ Массиве СТАНОВИТСЯ 2 [РАСПРЕДЕЛЕНИЕ + ВЫБРАННЫЙ ОБЪЕКТ С СОХРАНЕНИЕМ СЧЕТА 1]

Пожалуйста, уточните этот пункт, чтобы было легко понять проблему.

for(NSInteger f=0; f< [appDelegate.category_type count]; f++)
{
[category_type addObject:[appDelegate.category_type objectAtIndex:f]];
}

NSLog(@"appDelegate.category_type count => %d and category_type count => %d",[appDelegate.category_type count],[category_type count]);

Попробуйте отредактированный код и посмотрите количество обоих массивов. оба будут печатать одинаковое количество, значит, оба имеют объект. Даже после освобождения массива appDelegate.category_type количество сохраненных объектов будет 2, а не 1.

...