Утечка памяти iOS по словарю - PullRequest
1 голос
/ 28 февраля 2012

Я новичок в программировании на iOS и разработал приложение для своего клиента.Однако, когда я запускаю приложение с помощью Instruments, возникает проблема утечки памяти, вызванная словарем, но если я его освобождаю, приложение вылетает.Я не уверен, в чем проблема.

Это изображение инструментов: http://www.flickr.com/photos/71234685@N02/6791493522/in/photostream/

-(void) generateLiquidProductData:(NSArray*) liquidProduct {

    int _count = 52;

    self.liquidProductData = [[NSMutableArray alloc] initWithCapacity:_count];

    for (int i = 0; i < _count; i++){

        float x = i;
        float y;

        if ((liquidProduct != (id)[NSNull null]) && (liquidProduct != nil) && ([liquidProduct count] != 0)) {

            y = [[liquidProduct objectAtIndex:i] floatValue];
            y = round(y * 10000.0f) / 10000.0f;
        }
        else {

            y = 0.0;
            y = round(y * 10000.0f) / 10000.0f;
        }

        NSDictionary* _gotLiquidProduct = [NSDictionary dictionaryWithObjectsAndKeys:
                                                 [NSNumber numberWithDouble:x],X_VAL,
                                                 [NSNumber numberWithDouble:y],Y_VAL,
                                                 nil];
        NSLog(@"This is y %.5f", y);
        [self.liquidProductData addObject:_gotLiquidProduct];
    }
}

Ответы [ 2 ]

1 голос
/ 28 февраля 2012

Каждый раз, когда вы используете метод, в начале имени которого есть init, возвращаемый объект никогда не будет автоматически освобожден, поэтому вы обязаны его освободить.

Методы, начинающиеся с 'type'Как "arrayWith" "stringWith" возвращает объекты, которые были автоматически освобождены.

Другое дело, вы можете использовать статический анализ, чтобы найти утечки такого рода, это действительно легко. Статический анализ Xcode

1 голос
/ 28 февраля 2012

Утечка памяти связана с этой строкой:

self.liquidProductData = [[NSMutableArray alloc] initWithCapacity:_count];

Скорее всего, свойство помечено как retain или copy (обычно первое). Правильный способ его использования:

self.liquidProductData = [NSMutableArray arrayWithCapacity:_count];

Утечка связана с тем, что alloc возвращает ссылку с владельцем, которая вам позже понадобится release, но вы не отпустите ее. Теперь вы назначаете его свойству, которое сохраняет экземпляр. «Относительный счет удержания» теперь равен +2. Если вы назначите новое значение этому свойству, старый экземпляр будет освобожден, но это только уменьшит относительное количество сохранений до +1, таким образом, экземпляр никогда не будет освобожден. Это, в свою очередь, также приведет к утечке из вашего словаря и его значений, поскольку они все еще сохраняются в утечке массива.

...