iOS, загружающая представление из пера, создает утечки памяти? - PullRequest
1 голос
/ 11 января 2012

Я пытаюсь загрузить вид, который содержит вид карты и 2 кнопки, из отдельного файла NOB.

РЕДАКТИРОВАТЬ: я должен был упомянуть, что я не должен создавать подкласс UIViewController, потому что я не хочу, чтобы представление было представлено стандартным способом (например, модальным). Я хочу, чтобы он занимал только четверть экрана, был прозрачным и отображался как всплывающее окно. Поэтому UIVIewController НЕ рекомендуется для представления, которое не займет весь экран или, по крайней мере, не будет представлено как стандартный модальный контроллер представления или контроллер иерархии UINavigationController.

Не желая использовать подкласс UIViewController (Apple говорит, что не делает этого), я решил создать ContainerObject, потомок NSObject, который будет обрабатывать соединения и освобождения.

Внутри объекта контейнера у меня есть только 1 IBOutlet: (представление). Я загружаю перо таким образом внутри функции init:

- (id)init {
self = [super init];
if (self) {
    [[NSBundle mainBundle] loadNibNamed:"myNib" owner:self options:nil];
}
return self;

}

Внутри NIB есть представление, в котором есть MapView, и две кнопки. Как владелец файла, я установил класс моего объекта-контейнера и подключил выход «view» к выходу в владельце файла. Загрузка пера в порядке, и я могу загрузить его и добавить его представление в мое подпредставление.

self.currentLocationMapView = [[[CurrentLocationViewContainer alloc] init] autorelease];
self.currentLocationMapView.delegate = self;
[self.view addSubview:self.currentLocationMapView.view];

Проблема заключается в освобождении, поскольку, пока объект контейнера успешно освобожден, представление НЕ освобождается внутри него:

    [self.currentLocationMapView.view removeFromSuperview];
self.currentLocationMapView = nil;

Сообщение dealloc моего пользовательского представления, которое лежит в объекте контейнера, никогда не вызывается. Я должен явно вызвать [self.currentLocationMapView.view release], чтобы освободить его, когда захочу.

Обратите внимание, что "self.currentLocationMapView.view" является объектом-контейнером в моем контроллере представления. Контейнерный объект содержит пользовательский вид, который в свою очередь содержит вид карты и 2 кнопки.

1 Ответ

1 голос
/ 26 февраля 2012

Поскольку никто не ответил на вопрос, я также могу ответить на него сам, так как я нашел решение и некоторую другую полезную информацию при его поиске.

Решение моей проблемы заключалось в том, что в моем приложении очень трудно найти ошибку. Неважно, в чем заключалась ошибка, она очень специфична для приложения и не встречается ни в одном другом приложении.

Что касается UIViewControllers, вам не следует использовать UIViewControllers или подклассы для представления Views другим методом, чем стандартные методы Apple. Когда-либо. Если вы хотите представить пользователю представление, которое не является частью иерархии представлений, такой как UITabBarController, UINavigationController или что-либо подобное, вы должны сделать это программно, не используя View Controller в качестве объекта диспетчера этого класса. Вместо этого вы должны использовать NSObject в качестве менеджера представления.

Это связано с тем, что внутренние компоненты UIViewController хранят ссылки на представления и другие объекты внутри них, которые освобождаются при вызове определенных методов UIViewController. Когда они не являются частью иерархии представления Apple, эти методы никогда не будут вызваны, что приведет к утечкам памяти.

...