1

我遇到了一个问题,我在 cocos2D box2D 项目中使用的对象被垃圾覆盖。经过一番调试后,我发现如果以下行更改为:

player = [[[Player alloc] initWithWorld:world atLocation:ccp(playerPositionX, playerPositionY)] autorelease];

player = [[Player alloc] initWithWorld:world atLocation:ccp(playerPositionX, playerPositionY)];

然后问题就消失了。这非常令人困惑,因为此代码和底层类定义或多或少是学习 Cocos2D 书中描述的 SpaceViking 项目的代码副本。

我突然想到,问题可能是当我创建新项目时,我可能选择了自动引用计数,而我可能没有为 SpaceViking 项目选择。我目前正在使用 xcode 4.6,无法弄清楚如何确定该项目中是否使用了 ARC。我去构建设置并搜索自动引用计数,但找不到它。

如何确定我的项目是否使用自动引用计数?

4

3 回答 3

3

尝试这个:

#if __has_feature(objc_arc)
/* ARC is used */
#endif
于 2013-02-27T15:47:47.837 回答
1

尝试

[player release];

它应该给你“ARC Restrictions”错误

于 2013-02-27T15:53:57.017 回答
1

您已经可以告诉您在没有 ARC 的情况下进行构建:如果启用,您的调用autorelease将导致编译器错误。当然,这表明您的实际问题与 ARC 无关——删除autorelease调用可能会防止对象过度释放,但也很可能导致泄漏。

不过,除此之外:除了迄今为止建议的其他方法外,您还可以在 Xcode 中找到通常在项目或目标范围级别控制 ARC 的位置。在导航器中选择您的项目,然后在 Build Settings 选项卡中,在“Apple LLVM Compiler 4.2 - Language”下查找“Objective-C Automatic Reference Counting”(或使用顶部的搜索框查找“Automatic Reference Counting”或“ARC”。如果您使用的是其他人最初设置的项目,您可能还希望检查-fobjc-arc-fno-objc-arc标志是否设置在每个文件级别。当您的项目和在 Xcode 中选择目标。

于 2013-02-27T16:55:39.320 回答