UIViewController правильно освобожден, но его UIView нет? - PullRequest
2 голосов
/ 10 ноября 2010

Я использовал инструмент «Распределение» инструментов Apple и заметил, что при переходе между двумя представлениями распределение всегда увеличивается. В ходе расследования я обнаружил, что вся память принадлежит объектам, которые являются подпредставлениями UIView моего UIViewController.

Я проверил, и мой UIViewController освобождается, но, очевидно, UIView нет? Я не сохраняю UIView отдельно от контроллера UIView. У кого-нибудь есть идеи?

Вот код, который я написал для переключения между представлениями.

UISubViewController *viewController = [UIViewControllerFactory createViewController:viewControllerID];     // Creates and returns a UIViewController by ID

[currentViewController viewWillDisappear:YES];
[currentViewController.view removeFromSuperview];
[currentViewController viewDidDisappear:YES];

[viewController viewWillAppear:YES];
[self.view insertSubview:viewController.view atIndex:0];
[viewController viewDidAppear:YES];

self.currentViewController = viewController;
[viewController release];

Edit:
Хорошо, поскольку было опасение, что я просто использовал ViewController View и затем выпустил ViewController, я попытался провести эксперимент, в котором я создал новый класс, который является владельцем файла в NIB, но наследуется от NSObject.

код теперь выглядит так:

MyView *myView = [[MyView alloc] initWithNibName:@"myView"];

[currentView viewWillDisappear:YES];
[currentView.view removeFromSuperview];
[currentView viewDidDisappear:YES];

[myView viewWillAppear:YES];
[self.view insertSubview:myView.view atIndex:0];
[myView viewDidAppear:YES];

self.currentView = myView;
[myView release];

Инициализатор MyView выглядит так:

@interface MyView : NSObject {
    IBOutlet UIView *view;
    NSArray *nibTopLevelObjects;
}

@property (nonatomic, retain) UIView *view;

- (id)initWithNibName:(NSString *)nibName;

@end


@implementation MyView

@synthesize view;

- (id)initWithNibName:(NSString *)nibName {
    if (self = [super init]) {

        nibTopLevelObjects = [[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil];
        [nibTopLevelObjects retain];
    }
    return self;
}

- (void)dealloc {
    [view release];
    [nibTopLevelObjects release];

    view = nil;
    nibTopLevelObjects = nil;

    [super dealloc];
}

@end

Я все еще вижу утечку памяти в представлении каждый раз, когда меняю новые представления.

Есть какие-нибудь новые мысли?

Ответы [ 2 ]

0 голосов
/ 10 ноября 2010

Вы правильно удаляете старый вид и добавляете новый.Это означает, что либо где-то в вашем SubViewController вы по ошибке сохраняете представление, либо тестируете в симуляторе вместо устройства.

Можете ли вы опубликовать свой код для SubViewController, чтобы увидеть, что там происходит?

И получаете ли вы те же результаты, когда тестируете на реальном устройстве?


PS Адам Эбербах поднимает справедливую точку зрения - почему вы пытаетесь создать контроллер представления просто для того, чтобы украсть его представлениеа потом отпустить?

0 голосов
/ 10 ноября 2010

Ваша фабрика возвращает viewController, но вы только добавляете представление, а не выдвигаете новый контроллер.Почему бы просто не создать представление в этом случае?

То, что вы делаете, постоянно перезаписывает ivar self.currentViewController, не выпуская его.Возможно, вы освобождаете представление, принадлежащее этому контроллеру представления, но это все.

Возможно, currentViewController определен как

@property (nonatomic, retain) UISubViewController* currentViewController;

?Если это так, то есть сохранение, которое не совпадает с выпуском - вы никогда не выпускаете self.currentViewController до его перезаписи.Если вы не используете self., оно не будет сохранено, даже если свойство было так определено.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...