0

我在 java 和 c++ 开发方面有很多经验,所以类和抽象数据对我来说很容易。不久前我才开始目标 C,我主要是在课堂上与 globals 一起工作,一切进展顺利。我刚刚决定抽象我的大部分代码以减少意大利面条式代码,但我遇到了一个自周六以来我一直无法克服的问题。

大纲:

我正在做一个纸牌游戏。我最近将卡片数据抽象为一个包含 3 个变量的类;(int)i_cardValue、(int)i_cardSuit 和 (UIImage *)uii_cardImage。我通过调用创建了一张卡片

-(PlayingCard *)initWithValue:(int)i_initValue suit:(int)i_initSuit image:(UIIMage*)uii_initImage {

     [self setCardValue:i_initValue];

     [self setCardSuit:i_initSuit];

     [self setCardImage:i_initImage];

     return self;

}

我还抽象了引擎部分(基本上是套牌功能,例如洗牌和套牌管理)。甲板是一个可变数组,我有一个初始化甲板功能。

NSMutableArray *nsma_deck;
-(void)initDeck {
     nsma_deck = [[NSMutableArray alloc] initWithCapacity:52];
}

现在,在我的视图控制器中,我调用了 initDeck,然后我使用诸如

[pce_Engine initDeck];
[[pce_Engine nsma_deck] addObject:[[PlayingCard alloc] initWithValue:13 suit:2 image:[UIImage imageNamed:@"2C.png"]]];

pce_Engine 是 PlayingCardEngine 类型的变量。我将 NSLog 行放入 initDeck,当我运行我的程序时,它们不会显示在控制台中。他们没有被调用,所以数组没有被分配,因此我不能向数组添加东西?我以为我做得很好,但是要么我做错了,要么我错过了一些东西,因为将它添加到视图中不会让它显示出来。使用NSLog,deck == nil,所以我想问题是我没有正确访问deck,因此没有添加值,并且到处只有空变量:(。我尝试查看很多关于目标c的教程,但我什至还没有找到一个抽象的,所以我一直无法找到我的问题。

谁能指出我正确的方向?

4

2 回答 2

3

我假设您的卡类是一个子类,NSObject在这种情况下您应该实现指定的初始化程序 ( init),它调用[super init]并执行通用设置。在您的 initWith... 方法中,您应该调用[self init]然后执行分配。

这是一篇关于 cocoa/objective-c 初始化器的好帖子:http ://mikeash.com/?page=pyblog/the-how-and-why-of-cocoa-initializers.html

甲板管理课程也是如此。希望这有助于找到您的问题。

于 2009-11-24T12:46:01.660 回答
0

首先,我同意 Eimantas 的观点,即您的 init 方法缺少对 [super init] 的调用(您应该返回的值,请阅读普通 init 方法的外观)。

但至于 init_deck - 你的视图控制器中的什么方法你有这两行?我认为它不会被更多地基于调用代码的位置而不是其他任何东西(尽管当调用该代码时 pce_Engine 也可能为零,在这种情况下它根本不起作用)。

于 2009-11-24T20:03:31.743 回答