2012-02-28 2 views
1

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

Это изображение инструменты: http://www.flickr.com/photos/[email protected]/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]; 
    } 
} 
+0

line self.liquidProductData = [[NSMutableArray alloc] initWithCapacity: _count]; вызовет утечку: вы используете сеттер, поэтому, если свойство liquidProductData сохранено, это приведет к утечке. вместо этого вы можете добавить autorelease или использовать метод autoreleased [NSMutableArray arrayWithCapacity:] – AmineG

ответ

1

память из-за этой линии:

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

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

self.liquidProductData = [NSMutableArray arrayWithCapacity:_count]; 

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

+0

, но я использую это свойство впервые, поэтому без выделения я могу дать ввод? – Retro

+0

'[NSMutableArray arrayWithCapacity:]' также выделяется, но он возвращает ссылку без прав собственности, что означает, что вам не нужно явно ее выпускать. Затем этот объект присваивается вашему свойству, и это свойство теперь сохраняет его. – DarkDust

+0

oh !, Спасибо за ваше время, это заставляет меня понять концепцию! Большое спасибо. – Retro

1

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

Методы, которые начинаются с типа, подобного «arrayWith» «stringWith» возвращают объекты, которые автореализовываются.

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

+0

Закрыть, но это не 'init', который возвращает ссылку на владение, а' alloc'. См. [Руководство по программированию управления расширенной памятью] (https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html), раздел * Основные правила управления памятью *. – DarkDust

+0

Извините, я не обратил внимания на эту деталь, спасибо :) – Ganzolo

Смежные вопросы