У меня есть следующий вопрос: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 не выпущен. Так как я могу исправить эту проблему !!!!
Почему вы не используете ARC? Это сэкономит вам много времени, когда дело доходит до управления памятью. –
Apple предложила на WWDC, что ARC скоро станет ТОЛЬКО способом. Я настоятельно рекомендую вам начать использовать его. –
Я использовал ARC. но проблема существовала .. поэтому я скомпилировал ее без дуги, чтобы увидеть, где проблема. –