Преамбула: представление контроллера представления, о котором я говорю, используется в UISplitViewController в качестве представления сведений. Он заменяется, если пользователь перемещается с помощью UINavigationController разделенного представления. При нажатии «Назад» создается новый экземпляр моего проблемного контроллера представления, который назначается массиву контроллеров разделенного представления. Каждый раз, когда появляется мое представление, я вижу блок размером 8 МБ, выделенный в инструментах. Навигация вперед и назад в конечном итоге приведет к сбою приложения.
В деталях:
В моем классе, переопределяющем UIViewController, у меня есть:
private UIColor oBgColor = null;
в ViewDidLoad():
this.oBgColor = UIColor.FromPatternImage ( UIImage.FromFile ( "Data/Images/background.jpg" ) );
// This line here causes memory to go up by 8MB!
this.View.BackgroundColor = this.oBgColor;
в ViewDidDisappear():
// These lines should sucessfully get rid of the allocated 8MB chunk.
this.View.BackgroundColor = UIColor.Clear;
this.oBgColor.Dispose();
this.View.Dispose();
Код достигает ViewDidDisappear(), как и ожидалось, представление исчезло.
Блок размером 8 МБ выделяется ТОЛЬКО в том случае, если я назначаю this.oBgColor фоновому цвету представления. Оставьте эту строку, и все работает (но у меня нет фона). Каждый раз, когда отображается представление, я вижу, что еще 8 МБ тратятся впустую.
Что тут происходит? Известно ли, что BackgroundImage имеет утечку?
Интересное примечание: если я добавлю UIImageView в качестве подпредставления и использую его изображение вместо назначения свойству BackgroundColor представления, память практически не увеличится и будет правильно освобождена.