Objective c 基本IOS OOP-结构和实现

Objective c 基本IOS OOP-结构和实现,objective-c,ios,oop,Objective C,Ios,Oop,我正在用iOS为我的孩子们创建一个基本的猜谜游戏,我认为在我对如何在应用程序的整个生命周期中创建和发布对象的理解上存在一些基本的差距。我一直在阅读关于保留和发布周期的文章,但我认为我的问题更多地与应用程序的基本架构有关,以及我如何在实例化和杀死应用程序的几个关键对象时表现不佳 问题集中在两个特定的类别上 我有一个游戏类,我设计它来保存游戏运行所需的所有信息。当它被初始化时,它保存所有指向数组的实例变量,数组中包含字符串,如各种线索等。它基本上是游戏所需所有数据的容器 我有一个游戏视图控制器,它创

我正在用iOS为我的孩子们创建一个基本的猜谜游戏,我认为在我对如何在应用程序的整个生命周期中创建和发布对象的理解上存在一些基本的差距。我一直在阅读关于保留和发布周期的文章,但我认为我的问题更多地与应用程序的基本架构有关,以及我如何在实例化和杀死应用程序的几个关键对象时表现不佳

问题集中在两个特定的类别上

我有一个游戏类,我设计它来保存游戏运行所需的所有信息。当它被初始化时,它保存所有指向数组的实例变量,数组中包含字符串,如各种线索等。它基本上是游戏所需所有数据的容器

我有一个游戏视图控制器,它创建和查询游戏类的实例,以便在屏幕上显示游戏对象包含的各种元素

这样做很好。当用户开始一个新游戏时,游戏类的一个新实例被分配并初始化,然后离开

当我开始制作一个新游戏时,问题就出现了。这有很多种方式。要么用户完成游戏并开始另一个游戏,要么用户退出当前游戏然后开始新游戏

在我看来,我只需要释放游戏对象,然后alloc和init创建一个新的。但是,我注意到,在设备上运行并通过探查器查看时,游戏对象根本没有发布。它仍然在那里,并且游戏的每个实例化都会创建一个新的游戏对象,而旧的游戏对象仍然在那里,没有指向它的指针

在处理代码时,我注意到我没有在游戏类中实现dealloc方法……但是当我尝试这样做时,应用程序崩溃了,我怀疑是因为我试图释放以前发布的对象

理想情况下,我试图做的是摆脱旧游戏对象,或者在每次新游戏开始时用新对象替换旧对象(覆盖)

然而,这种方法是错误的吗?我应该用完全不同的方式来做吗?比如只创建游戏类的一个实例,并在该类中重写一个方法,以生成一组新的线索,等等,每次新游戏启动时,GameViewController都会告诉它

是否有一种“最佳实践”方法可以做到这一点

您已经了解了我在做什么,下面是GameViewController的代码,其中创建了Game类的实例:

#import "GameViewController.h"

@implementation GameViewController

@synthesize game =  _game;


-(void)startNewGameOfLevel:(NSInteger)level
    {
        if(!_game)
        {
            Game *g = [[Game alloc]initGamewithLevel:level]; 
            [self setGame:g];
            [g release]; g = nil;
        }

        [self set_currentlevel:[_game _currentLevel]];

        // set up popover to show the rounds goal letter
        [self setUpPopOver];

    }

-(void)quitTheCurrentGameAndStartNewGame
{
    [_game release]; _game = nil;
    [self clearGamePlayingField];
     animationStepIndex =  0;
    [self startNewGameOfLevel: _currentlevel];
}
带有游戏类指定初始值设定项的游戏类(节略):

    #import "Game.h"


    @implementation Game

    @synthesize arrayOfLowerCaseLetters = _arrayOfLowerCaseLetters;
    @synthesize arrayOfPhrases=  _arrayOfPhrases;

    @synthesize goalLetter = _goalLetter;
    @synthesize goalPhrase = _goalPhrase;
    @synthesize gameLetterPool = _gameLetterPool;

    @synthesize _indexForGoalLetter, _numberOfLevelsInGame, _currentLevel, _numberOfWhackHoles, _numberOfLettersInGameLetterPool;

    -(id)initGamewithLevel:(NSInteger)level
    {
        [super init];

        //create an array of lower case letters. These will
        //contain the full alphabet of all possible letters

        NSArray *arrayOfLCLetters = [[NSArray alloc] initWithObjects:@"a", @"b", @"c", @"d",@"e", @"f", @"g", @"h", @"i", @"j", @"k", @"l", @"m", @"n", @"o", @"p", @"qu", @"r", @"s", @"t", @"u", @"v", @"w", @"x",@"y", @"z",@"ch", @"sh", @"th", nil];
        [self setArrayOfLowerCaseLetters: arrayOfLCLetters];
        [arrayOfLCLetters release];arrayOfLCLetters = nil;

        //create an array of phrases.
        // These must correspond with each of the letters. e.g. a = apple.

        NSArray *phrases= [[NSArray alloc ] initWithObjects:
                           @"apple",
                           @"butterfly",
                           @"cat",
                           @"dog",
                           @"egg",
                           @"frog",
                           @"ghost",
                           @"horse",
                           @"igloo",
                           @"jam",
                           @"kite",
                           @"leaf",
                           @"moon",
                           @"nut",
                           @"orange",
                           @"pig",
                           @"queen",
                           @"rabbit",
                           @"snake",
                           @"tree",
                           @"umbrella",
                           @"van",
                           @"water",
                           @"x-ray",
                           @"yak",
                           @"Zebra",
                           @"chair",
                           @"shoes",
                           @"thumb",

                           nil];
        [self setArrayOfPhrases:phrases];
        [phrases release]; phrases = nil;


        //choose a random number to be the index reference for
        // each goal letter and goal phrase.
        [self set_indexForGoalLetter:(arc4random()%[_arrayOfLowerCaseLetters count])];
        NSLog(@"index for goal letter is:, %i", _indexForGoalLetter);

        //set Goal letter and goal phrase
        [self setGoalLetter: [_arrayOfLowerCaseLetters objectAtIndex: _indexForGoalLetter]];
        [self setGoalPhrase: [_arrayOfPhrases objectAtIndex:_indexForGoalLetter ]];

        //set current level
        [self set_currentLevel: level];
        //[self set_currentLevel: 2];


        //set number of whackholes by level
        [self set_numberOfWhackHoles: [self numberOfWhackHolesByLevel:_currentLevel]];

        //generate size of Letter pool by level
        [self set_numberOfLettersInGameLetterPool:[self numberOfLettersInLetterPoolbyLevel:_currentLevel]];

        ////////////////////////////
        ///  Game letter pool
        ///////////////////////////

        //set up array ton hold the pool of letters
        NSMutableArray *gp = [[NSMutableArray alloc] initWithCapacity:_numberOfLettersInGameLetterPool];
        [self setGameLetterPool: gp];
        [gp release];gp = nil;

        //add the goal letter to this pool
        [_gameLetterPool addObject:_goalLetter];

        int i = 1;

        while (i < _numberOfLettersInGameLetterPool) {
            NSString *letter = [_arrayOfLowerCaseLetters objectAtIndex:(arc4random()%[_arrayOfLowerCaseLetters count])];
            if ([_gameLetterPool containsObject:letter] == false)
            {
                [_gameLetterPool addObject:letter];
                i++;
            }

        }

        NSLog(@"********** Game created  ***************");
        NSLog(@"pool of letters is: %@", [_gameLetterPool description]);
        NSLog(@"****************************************");
        NSLog(@"current goal letter is: %@", _goalLetter);
            NSLog(@"****************************************");
        NSLog(@"current goal phrase is: %@", _goalPhrase);
            NSLog(@"****************************************");

        return self;
    }

-(void)dealloc
{
    [super dealloc];
    [_arrayOfLowerCaseLetters release]; _arrayOfLowerCaseLetters = nil;
    [_arrayOfPhrases release]; _arrayOfPhrases = nil;
    [_goalLetter release];_goalLetter = nil;
    [_goalPhrase release]; _goalPhrase = nil;
    [_gameLetterPool release];_gameLetterPool = nil;
}
#导入“Game.h”
@实施游戏
@合成ArrayFlowerCaseLetters=_ArrayFlowerCaseLetters;
@合成数组短语=_数组短语;
@综合得分者=_得分者;
@综合目标短语=_目标短语;
@合成gamelettpool=\u gamelettpool;
@合成指数指示器、电平信号名称数、电流电平数、黑洞数、字母信号名称数;
-(id)initGamewithLevel:(NSInteger)级别
{
[超级初始化];
//创建一个小写字母数组。这些将
//包含所有可能字母的完整字母表
NSArray*arrayOfLCLetters=[[NSArray alloc]initWithObjects:“a”,“b”,“c”,“d”,“e”,“f”,“g”,“h”,“i”,“j”,“k”,“l”,“m”,“n”,“o”,“p”,“qu”,“r”,“s”,“t”,“u”,“v”,“w”,“x”,“x”,“y”,“z”,“ch”,“h”,“n”,“h”,“n”,“n”,“o”,“o”,“p”,“Q”,“r”,“s”,“t”,“u”,“v”,“w”,“w”,“x”,“x”,“x”,“x”,“y”,“z”,“h”,“h”,“h”,“n”,“n”,“h”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n”,“n;
[自我设置ArrayOflowerCaseLetters:arrayOfLCLetters];
[arrayOfLCLetters释放];arrayOfLCLetters=nil;
//创建一个短语数组。
//这些字母必须与每个字母对应。例如a=苹果。
NSArray*短语=[[NSArray alloc]initWithObjects:
@“苹果”,
@“蝴蝶”,
@“猫”,
@“狗”,
@“鸡蛋”,
@“青蛙”,
@“鬼”,
@“马”,
@“冰屋”,
@“果酱”,
@“风筝”,
@“叶子”,
@“月亮”,
@“坚果”,
@“橙色”,
@“猪”,
@“女王”,
@“兔子”,
@“蛇”,
@“树”,
@“雨伞”,
@“货车”,
@“水”,
@“x光”,
@“牦牛”,
@“斑马”,
@“主席”,
@“鞋子”,
@“拇指”,
零];
[自我设置数组短语:短语];
[短语发布];短语=零;
//选择一个随机数作为索引参考
//每个目标字母和目标短语。
[self-set_indexForGoalLetter:[arc4random()%[[u arrayOfLowerCaseLetters count]);
NSLog(@“目标字母的索引为:,%i”,_indexForGoalLetter);
//设定目标字母和目标短语
[self-setGoalLetter:[u ArrayOwerCaseLetters objectAtIndex:[u indexForGoalLetter];
[self-setGoalPhrase:[u arrayOfPhrases objectAtIndex:[u indexForGoalLetter];
//设置当前水平
[自设置\u currentLevel:level];
//[自设\u电流等级:2];
//按级别设置异常孔的数量
[self set_numberOfWhackHoles:[self numberOfWhackHolesByLevel:_currentLevel];
//按级别生成信件池的大小
[self set_NumberOfLetterSingamelettPool:[self numberOfLettersInLetterPoolbyLevel:_currentLevel];
////////////////////////////
///游戏信池
/////////////////////
-(void)startNewGameOfLevel:(NSInteger)level
    {
        if(![self game])
        {
            Game *g = [[Game alloc]initGamewithLevel:level]; 
            [self setGame:g];
            [g release]; g = nil;// g = nil, not necessary when it's about to go out of scope
        }

        [self set_currentlevel:[[self game] _currentLevel]]; // don't use _ to start methods - Apple reserves this convention

        // set up popover to show the rounds goal letter
        [self setUpPopOver];

    }

-(void)quitTheCurrentGameAndStartNewGame
{
    [self setGame: nil];
    [self clearGamePlayingField];
     animationStepIndex =  0;
    [self startNewGameOfLevel: _currentlevel];
}