Сбой памяти из-за [super dealloc] контроллера uiview - PullRequest
3 голосов
/ 30 октября 2009

У меня есть экземпляр uiviewcontroller, и когда я выпускаю его, вызывается метод dealloc.

Я выпустил некоторые объекты в методе dealloc этого uiviewcontroller.

Если я прокомментирую [super dealloc] приложение работает нормально, но если нет, то оно падает.

Я думаю, что нет никаких проблем с выпусками, которые я делаю в этом методе, но если я делаю [super dealloc], он падает.

Может ли кто-нибудь помочь мне с этим?

Ответы [ 3 ]

4 голосов
/ 01 ноября 2009

Трудно сказать по вашему сообщению без дополнительной информации, но выглядит ли ваш метод dealloc следующим образом?

- (void)dealloc {

    [super dealloc];

    self.someProperty = nil;
}

Потому что, если это так, вы вызываете метод setter для освобожденного экземпляра. Вы всегда должны вызывать [super dealloc] last:

- (void)dealloc {

    self.someProperty = nil;

    [super dealloc];

}

Не уверен, поможет ли это. Попробуйте опубликовать, как выглядит ваш метод dealloc, если нет. Трудно устранить неисправность в темноте.

1 голос
/ 30 октября 2009

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

Вы, вероятно, получаете доступ к контроллеру представления после его освобождения, поэтому проблема не в [super dealloc], а в любом другом месте приложения, которое обращается к контроллеру представления.

0 голосов
/ 01 ноября 2009

Возможно, вы отпускаете контроллер не в том месте. Это может быть причиной того, что ваш [super dealloc] в вашем ViewController.m дает сбой

Вы не должны вызывать [viewController release], пока не хотите, чтобы этот контроллер умер. Например, если у вас есть приложение с только viewcontroller, вы не должны выпускать его, пока приложение не завершится. Это потому, что этот контроллер должен оставаться в живых все время, чтобы контролировать вид. Если у вас в ApplicationDelegate что-то вроде этого, это приведет к сбою:

- (void)applicationDidFinishLaunching:(UIApplication *)application {
UIViewController *controller = [[UIViewController alloc] init];
[window addSubview:controller.view];
[controller release]; //this will crash
}

Вместо этого вы должны поместить ваш viewcontroller в заголовочный файл (.h) и освободить его в методе dealloc:

- (void)dealloc {
[controller release];
[window release];
[super dealloc];
}

Надеюсь, это поможет.

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