Цитировать из документа CGLayer:
Кварц кэширует любые объекты, которые используются повторно, включая объекты CGLayer.
У меня проблемы с памятью на больших страницах, и я пытаюсь реализовать простой механизм, при котором представления освобождаются и воссоздаются в зависимости от того, включены они или нет на экране.
Скажем ради простоты, что у меня есть куча UIImages, созданных в результате сетевого запроса, сохраненных где-то в массиве. Я создаю UIImageView так:
anImage = [anArray objectAtIndex:0];
UIImageView* imgView = [[UIImageView alloc] initWithImage:anImage];
[mainView addSubview:imgView]; // Quartz eats memory for view after first draw
[imgView release]; // owned by mainView now
[...] // wait a bit for draw cycle
[imgView removeFromSuperview]; // memory doesn't go down
Когда imgView
выходит за пределы экрана, он removedFromSuperview
и освобождается. Хорошо верно? Нет, CGLayer, существующий в Quartz, не удаляется, потому что anImage
все еще существует.
Как я могу обойти это? Единственный способ в этом сценарии - создать изображение точно так же за спиной Кварца с другим адресом указателя и удалить старое изображение. И единственный способ сделать это - «глубоко скопировать» изображение (UIImage не реализует NSCoding) или запросить его снова по сети (медленно).
Что я думаю, так это то, что мне нужно помещать свои изображения в базу данных и перевыпускать их каждый раз, когда на экране появляется представление, но мне бы очень хотелось услышать мнения людей по этому поводу.