Проблема с навигацией - PullRequest
1 голос
/ 14 июля 2011

Я использую некоторые методы для загрузки нового .xib и возврата в главное меню.Однако примерно через пять раз происходит сбой при использовании слишком большого количества памяти.Мне нужно иметь возможность вернуться в главное меню и в игру много раз.Любые другие методы, которые я должен использовать для элементов управления навигацией.

Часть главного меню:

GameViewController* game = [[GameViewController alloc initWithNibName:@"GameViewController" bundle:nil];
[self.navigationController pushViewController:game animated:NO];

Часть игры для возврата в главное меню:

[self.navigationController popViewControllerAnimated:NO];

Вот viewdidLoad {- (void) viewDidLoad {[super viewDidLoad];[self StartTimer];

TotalSeconds = 0;
GameCenterTotalSeconds = 0;
timeSec = 0;
timeMin = 0;


Background = [[[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 480, 320)] autorelease];
Background.image = [UIImage imageWithContentsOfFile:[ [ NSBundle mainBundle] pathForResource:@"Background" ofType:@"png"]];
[self.view addSubview:Background];


timeLabel.textColor = [UIColor redColor];
[self.view addSubview:timeLabel];


NumberLabel = [[[UIImageView alloc] initWithFrame:CGRectMake(0, -4, 60, 70)] autorelease];
NumberLabel.image = [UIImage imageWithContentsOfFile:[[ NSBundle mainBundle] pathForResource:@"Number" ofType:@"png"]];
[self.view addSubview:NumberLabel];

QuestionNumber = [[[UILabel alloc] initWithFrame:CGRectMake(23, 17, 20, 20)] autorelease];
QuestionNumber.text = @"1";
QuestionNumber.textColor = [UIColor redColor];
QuestionNumber.backgroundColor = [UIColor clearColor];
[QuestionNumber setFont:[UIFont fontWithName:@"Marker Felt" size:30]];
[self.view addSubview:QuestionNumber];

numberLives = 1;

appDelegate = (OppositeMoronTestAppDelegate *)[[UIApplication sharedApplication]delegate];


musicButton = [[[UIButton buttonWithType:UIButtonTypeCustom] retain] autorelease];
musicButton.frame = CGRectMake(5, 283, 35, 35);
musicButton.backgroundColor = [UIColor clearColor];

if (appDelegate.shouldPlayMusic == YES) {

    UIImage *Image = [UIImage imageWithContentsOfFile:[[ NSBundle mainBundle] pathForResource:@"MusicOn" ofType:@"png"]];
    [musicButton setBackgroundImage:Image forState:UIControlStateNormal];
    [musicButton addTarget:self action:@selector(TurnMusicOff) forControlEvents:UIControlEventTouchUpInside];
} else {
    UIImage *Image = [UIImage imageWithContentsOfFile:[[ NSBundle mainBundle] pathForResource:@"MusicOff" ofType:@"png"]];
    [musicButton setBackgroundImage:Image forState:UIControlStateNormal];
    [musicButton addTarget:self action:@selector(TurnMusicOn) forControlEvents:UIControlEventTouchUpInside];

}


[self.view addSubview:musicButton];
[self showQuestion1];

}

}

1 Ответ

0 голосов
/ 14 июля 2011

try autorelease на вашем контроллере вида:

GameViewController* game = [[[GameViewController alloc initWithNibName:@"GameViewController" bundle:nil] autorelease];

Контроллер навигации станет владельцем переданного ему контроллера вида, поэтому вам не нужно сохранять ссылку на него.Но вы не можете продолжать выделять GameViewControllers снова и снова, не выпуская их.autorelease полезно для этого.Вы также можете выпустить его после того, как передаете его в контроллер навигации, если предпочитаете:

GameViewController* game = [[GameViewController alloc initWithNibName:@"GameViewController" bundle:nil];
[self.navigationController pushViewController:game animated:NO];
[game release];
game = nil;

РЕДАКТИРОВАТЬ: так что если вы уже освобождаете объект game, то это должно быть утечка памятивнутри самого класса GameViewController.

Все, что вы выделяете, копируете или сохраняете в своем классе GameViewController, который вы должны выпустить в методе dealloc (и, возможно, также в методе viewDidUnload, еслиВы выделяете / копируете / сохраняете в методе viewDidLoad.

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

Если вы хотите опубликовать соответствующий код из класса GameViewController, я уверен, что кто-то сможет помочь вам определить утечку памяти.

Вы также можете попробовать инструмент Leaks в Instruments

EDIT 2:

Я предполагаю, что у вас есть несколько IBOutlets, связанных со свойствами в вашем GameViewController классе ...

don 'не знаю, если вы уже делаете это, но в вашем методе viewDidUnload и в методе dealloc выУбедитесь, что все эти свойства IBOutlets установлены в nil для их освобождения, например:

- viewDidUnload
{
    //... whatever comes before

    self.timeLabel = nil;
    self.NumberLabel  = nil;
    //... etc
}
- dealloc
{
    //... whatever comes before

    self.timeLabel = nil;
    self.NumberLabel  = nil;
    //... etc

    [super dealloc];
}

В общем, если у вас есть какие-либо свойства, объявленные с retain, это означает, что когда вы устанавливаетеЭто свойство объекта будет сохранено.Если вы установите для этого свойства значение nil, то объект, который там был, будет released для вас.Таким образом, любые свойства с ключевым словом retain должны быть установлены на nil (или выпущен резервный ivar).

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