2013-07-07 2 views
1

У меня есть следующий вопрос:IOS addSubview и removeFromSuperview причиной утечки памяти

У меня есть один экземпляр из класса, который расширяет класс UIViewController, в этом классе я добавляю UIImage в UIImageView, а затем добавить UIImageView к себе. просмотрите с помощью этого метода «addSubview:» [self.view addSubview: imageView] и, наконец, добавив self.view в окно, используя [[[UIApplication sharedApplication] keyWindow] addSubview: [self view]], и когда я нажимаю на закрытие Я очищаю self.view (удаление подзаголовка «UIImageView») и удаление self.view из окна.

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

- (void) setImageWithURL: (NSString *)url { 

    NSData * imageData =NSData * imageData =[NSData dataWithContentsOfURL:[NSURL URLWithString:url]]; 

    if (imageData) { 
      UIImage *image = [[UIImage alloc]initWithData:imageData]; 
      [[[UIApplication sharedApplication] keyWindow] addSubview:[self view]]; 
      [self createViewWithImage:image]; 
      [image release]; 
} 

-(void) createViewWithImage: (UIImage *) image{ 
    [self.view setHidden:false]; 
    UIImageView *imageView = [[UIImageView alloc] initWithImage:image]; 
    [self.view addSubview:imageView]; 
    [imageView release]; 
} 

// for removing the imageView when i click on close button 
-(void) closeView{ 
      for (UIView *subView in self.view.subviews) { 
        [subView removeFromSuperview]; 
      } 
      [self.view removeFromSuperview]; 

} 

Примечание: Я использовал инструменты xcode для проверки распределения памяти.

ОБНОВЛЕНИЕ: после дополнительных исследований .. это не addSubview & removeFromSuperview, которые делают утечки памяти .. его NSData. Я не понимаю, почему его не выпустили из памяти. Я сделал некоторые изменения, чтобы проверить, если его действительно NSData, я сохранил изображение локально и установить изображение, используя два случая:

//Case 1: 
NSString *path = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"]; 
NSData * imageData =[[NSData dataWithContentsOfFile:path]; 
image = [[UIImage alloc]initWithData:imageData]; 


//Case 2: 

NSString *path = [[NSBundle mainBundle] pathForResource:@"image" ofType:@"png"]; 
image = [[UIImage alloc] initWithContentsOfFile:path]; 

Я обнаружил, что случай один делает утечки памяти, в то время как корпус 2 чист.

Теперь UIImage не может взять изображение без использования NSData, и по какой-либо причине NSData не выпущен. Так как я могу исправить эту проблему !!!!

+0

Почему вы не используете ARC? Это сэкономит вам много времени, когда дело доходит до управления памятью. –

+1

Apple предложила на WWDC, что ARC скоро станет ТОЛЬКО способом. Я настоятельно рекомендую вам начать использовать его. –

+0

Я использовал ARC. но проблема существовала .. поэтому я скомпилировал ее без дуги, чтобы увидеть, где проблема. –

ответ

0

У Вас есть:

[super dealloc]; 

в dealloc вашего Выводя класса?

+0

Да, у меня [super dealloc]; –

+0

Вы специально видите утечку памяти, используя «Утечки в приборах»? Также смотрите http://stackoverflow.com/questions/8647044/viewcontroller-never-gets-deallocated – shaioz

+0

Да, когда я проверил код без [self.view addSubview: imageView]; нет проблемы с памятью. но добавление UIImageView в self.view вызывает проблему. –

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