好的 - 不太明白这里发生了什么。我正在构建一个简单的纸牌游戏。我创建了一个UIView类别来处理“卡”应该是的所有东西。我认为这是无关紧要的,但也许不是。
无论如何,在我的视图控制器中,我只是创建2个NSMutableArrays来保持经销商和玩家的手。然后我正在调用一种设置卡值的方法。在那个方法中,我做一个NSLog来查看特定的卡对象的值 - 而且它看起来都很好。但是如果我试图从我的视图控制器中获取该值,它总会返回所有具有数组中最后一个对象值的对象。
一些代码:
playersCards = [[NSMutableArray alloc] initWithObjects:[[UIView alloc] init],[[UIView alloc] init],nil];
[[playersCards objectAtIndex:0] setCardValue];
[[playersCards objectAtIndex:1] setCardValue];
NSLog(@"1: %i",[[playersCards objectAtIndex:0] returnValue]);
NSLog(@"2: %i",[[playersCards objectAtIndex:1] returnValue]);
所以当我在调用setCardValue(这是在类别中)之后得到NSLog时 - 再次,一切都很好。但那些NSLog就在那里 - 他们为两者返回索引1的值。这里发生了什么事?
答案 0 :(得分:4)
setCardValue
方法无法知道卡片所处的索引,除非您正在做一些复杂的事情。因此,您可能有两张卡,但它们是相同的初始化。
然而,这里存在更大的问题。你真的不想将UIView
个实例用作这样的数据。你真的想要将屏幕[View]上的东西与保持游戏状态[模型]的位分开。通常,介于两者之间的层根据用户与视图[控制器]的交互来管理模型状态。
有关详细信息,请参阅Model-View-Controller上的文档。
使用类别挂起现有类似乎很方便,但它实际上不应该用作在应用程序中封装数据,状态和/或逻辑的主要模式。
你真的希望保持数据[游戏状态]与屏幕上的数据绘制方式[视图]保持隔离。
就您评论中的具体问题而言,另一个问题是:
想象一下,您的代码是这样编写的:
Card *c = [cardArray objectAtIndex: 0];
[c doSomething];
c
如何知道该代码中的索引是什么?现在,请注意,所述代码与[[cardArray objectAtIndex:0] doSomething];
相同。
如果我正在设计某种卡片游戏,我可能会创建一些类:
一个Card
类,只存储套装和值。支持NSCoding用于存档目的。
CardView
的{{1}}子类,给定一个套装和值,知道如何呈现卡片。
一组UIView
和GameFieldView
类知道如何绘制playfield(前者,UIView子类)以及如何将CardViews移动到playfield(后者,UIViewController)
GameFieldController
的特定子类,为手,堆栈,堆和/或创建纸牌游戏所需的任何其他内容添加逻辑。
....等....
也就是说,我将游戏分解为适合iOS或OS X模型视图控制器模式的一系列类,这样我就可以编写最少量的代码并让系统完成繁重的操作旨在做。
这看起来有点矫枉过正,所有这些课程和所有课程都是如此,但实际上,个别课程相对简单且相当灵活。