UIImageViews, добавленные в UIScollView, никогда не освобождаются, утечка памяти? - PullRequest
0 голосов
/ 28 сентября 2011

Это мой первый пост, а вы моя последняя надежда.

У меня есть список с изображениями в моем приложении для iPad, если вы выберете один, мой класс MyViewController, который расширяется UIViewController, загружен ипоказано (просто установив window.rootViewController, используя UINavigationController, presentModalViewController - все перепробовал, без разницы).Он имеет UIScrollView внутри, что добавляет большую версию изображения к UIScrollView с этим кодом:

UIImageView *tempImageView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:[[delegate getImageNames] objectAtIndex:(gameNr*2)]]];
tempImageView.frame = CGRectMake(0,0,tempImageView.frame.size.width/2,tempImageView.frame.size.height/2);
[self setMyImage:tempImageView];
[tempImageView release];

myScrollView.contentSize = CGSizeMake(myImage.frame.size.width, myImage.frame.size.height);
myScrollView.maximumZoomScale = 2.0;
myScrollView.minimumZoomScale = 1.0;
myScrollView.clipsToBounds = YES;
myScrollView.bounces = NO;
myScrollView.delegate = self;
[myScrollView addSubview: myImage];

myImage является свойством (nonatomic, retain) типа UIImageView внутриmy MyViewController.

После нажатия кнопки и возврата к списку изображений я освобождаю ссылку на MyViewController, и ее метод dealloc вызывается так:

- (void)dealloc
{
    CFShow(@"dealloc!");
    for(UIImageView *subview in [myScrollView subviews]) {
        if(subview.frame.size.width > 20){
            [subview removeFromSuperview];
            [subview setImage:nil];
        }
    }

    [myImage setImage:nil];

    self.myScrollView = nil;
    self.myImage = nil;

    [myScrollView release];
    [myImage release];
    [super dealloc];
}

Это работает до сих пор, но проблема в том, что память изображений на самом деле не освобождается таким образом.После открытия и закрытия около 12 изображений приложение вылетает с предупреждением памяти.Это также подтверждается методом report_memory, который я получил здесь: Сбой памяти в iOS, но очень низкое использование памяти

Вызван метод dealloc, проверен трижды.Я проверил переменные myImage и myScrollView через точку останова в отладчике, они установлены в 0x0 этими командами в методе dealloc.Почему память не освобождается ????????

Спасибо за любые предложения, я работаю над этим целых три дня, это сводит меня с ума.

1 Ответ

0 голосов
/ 28 сентября 2011

Заменить это:

self.myScrollView = nil;
self.myImage = nil;

[myScrollView release];
[myImage release];

с этим:

[myScrollView release];

self.myScrollView = nil;
self.myImage = nil;

И почтовый индекс, где вы определяете свойство myScrollView и init it.

И вам не нужен цикл for(UIImageView *subview in [myScrollView subviews]). Когда вы будете release myScrollView возражать, он автоматически освободит все свои подпредставления.

...