一个被滥用的话题,但我无法找到一个答案。 我下面“了解iPhone和iPad的cocos2d游戏开发”一书,并不能真正理解,如果在ShootEmUp例子(可在方法1 )是最好的一个。 笔者使用到它增加了作为孩子的各种对象GameScene(如船舶,InputLayer等)。 有争议的方面是内的那些对象有通过使用返回在GameScene的init方法实例化GameScene类的静态实例的静态方法调用到GameScene。 这对我来说似乎是一个循环引用,并根据很多(例如,看到这个帖子)是值得避免。 我安静不知道,因为这种方法被发现,也是在游戏编程真1 ,有可能是一个原因。
会有人能够澄清? 我还在犹豫着要彻底调整自己的代码或保持静态变量的方法。
非常感谢你 :)!
源代码
你在这里看到是一个半单件模式,它是整个科科斯广泛使用,其实科科斯框架本身是完全建立在单一对象(如很多苹果的UIKit的)。 游戏经常使用的单身,因为你通常有大量的中央数据的游戏,像得分,卫生,武器等,您的许多对象需要有一定的了解。 您通常也有物体,如玩家,敌人等需要通知您的应用程序的中央调度他们在做什么在游戏中,以便其他对象可以反应或相应的调整。
这就是为什么许多科科斯游戏使用你这里显示的技术。 如果你了解的单身编程的风险是不坏的做法。 基本上,记住这一点:
- 无论您使用的是单式技术或者不是使用其他方法调用父,你基本上是在做同样的事情,无论哪种方式。 它可能不如直接引用中央游戏引擎直接不是靠方法来推导它。 我不建议使用
[self parent]
作为可以得到难以阅读和调试后,当你首先要弄清楚“谁是家长”,而不是一个单独的访问可以让你知道你正在访问立即谁。 - 孩子不应该保留它的父。 您可以参考父,但不保留。
- 这里的单方法的替代方法是让伊娃在指向父的孩子。 但是,这是本质上是相同的想法,所以要尽量减少保留周期的风险,访问单通常是安全的。 如果没有设置你的伊娃正确,你可以有一个循环引用。 您在这里显示的方法不是循环引用。
请注意,这个特殊的代码阻止您使用+(GameScene*) sharedGameScene
方法,直到GameScene已初始化之后 。 这是什么使得它半单。 通常情况下,如果它尚未初始化,以便使用此类方法要么返回或首先创建并返回对象这种方法在单就足以初始化自己聪明。
也许不是在科科斯一个问题,因为你做任何事情之前,你可能会初始化游戏场景,所以它已经存在了。
我猜你指的这个部分:
static GameScene* instanceOfGameScene;
+(GameScene*) sharedGameScene
{
NSAssert(instanceOfGameScene != nil, @"GameScene instance not yet initialized!");
return instanceOfGameScene;
}
这不会创建一个循环引用。 有人可能会说,这不是一场伟大实践,以建立自己的这样的代码,但是这是一个不同的讨论。
如果从这个函数(返回值GameScene
对象)并不像一些GameScene孩子的强烈属性引用,它的确定。
您将有循环引用的情况下,如果你有这样的一个孩子:
@property(nonatomic, strong) GameScene *mainScene;
// OR for non-ARC
@property(nonatomic, retain) GameScene *mainScene;
这将一直保持为引用计数GameScene
对象出现0和dealloc的-ING。
希望这可以帮助。