2010-11-06 6 views
1

Я пытаюсь динамически добавлять изображения в ScrollView. Перед добавлением я проверяю, есть ли какие-либо подпункты в ScrollView и удаляют их в цикле for.Утечка объекта: добавление и удаление UIImageView в UIScrollView

Когда я освобождаю изображение, я получаю ошибку времени выполнения, заявляя, что пытаюсь получить освобожденный экземпляр. Если я удалю заявление релиза приложение будет работать правильно, но «строить и анализировать» показывает утечку из-за го счетчика ссылок ImageView не уменьшились ..

if ([scrollView.subviews count]>0){ 
    for (int i=0; i<[scrollView.subviews count]; ++i) { 
     [[scrollView.subviews objectAtIndex:i] removeFromSuperview]; 
    } 
} 

//Making a scroller with results 
int scrollWidth = 0.0f; 
int scrollHeight = 0.0f; 
for (int i = 0; i<previewImages.count;++i) 
{ 
    UIImage *image=[previewImages objectAtIndex:i]; 
    scrollWidth = scrollWidth + image.size.width; // Width of all the images 
    if (image.size.height > scrollHeight)scrollHeight= image.size.height; // Maximum image height 
    [image release]; 
} 

float xC = 0.0f; 
for (int i=0; i<previewImages.count; ++i) { 

    UIImage *image=[previewImages objectAtIndex:i]; 
    UIImageView *imageview = [[UIImageView alloc] initWithFrame:CGRectMake(xC, 0.0f, image.size.width, image.size.height)]; 
    UILabel *subScript = [[UILabel alloc] initWithFrame:CGRectMake(xC, image.size.height-30.0f, image.size.width,30.0f)]; 

    subScript.textColor = [UIColor whiteColor]; 
    subScript.backgroundColor = [UIColor colorWithWhite:0.5f alpha:0.5f]; 
    subScript.text = [imagePaths objectAtIndex:i]; 

    imageview.image = image; 

    xC = xC + image.size.width; 
    [image release]; 
    [scrollView addSubview:imageview]; 
    [imageview release]; 
    [scrollView addSubview:subScript]; 
    [subScript release]; 
} 
[scrollView setContentSize:CGSizeMake(scrollWidth , scrollHeight)]; 

Любых предложения о утечке памяти или общих лучших практиках для добавления и удаление представлений из массива в scrollView очень ценится!

ответ

1
if ([scrollView.subviews count]>0){ 
    for (int i=0; i<[scrollView.subviews count]; ++i) { 
     [[scrollView.subviews objectAtIndex:i] removeFromSuperview]; 
    } 
} 

не так, потому что вы удаляете subview из массива subviews. Итерация на обратном будет исправлять это, но я бы предложил сохранить представление в отдельном массиве.

+0

Привет, Тиа, спасибо за быстрый ответ. Я понимаю, что вы говорите об обратной итерации, чтобы очистить массив, но не могли бы вы подробнее остановиться на своем втором замечании? Кроме того, он не устранял утечку памяти. – Wicketman

+0

Я имею в виду сохранение вида в приватном NSArray после инициализации ваших представлений, поэтому вы владеете массивом, тогда его проще управлять. Про утечку, я не вижу ничего плохого в вашем фрагменте кода. Вы действительно уверены, что есть утечка? Как вы его протестировали? – tia

+0

Я использовал NSZombiesEnabled, который показывает мне в консоли отладки: *** - [UIImage release]: сообщение отправлено на освобожденный экземпляр. – Wicketman