【问题标题】:how can I determine if my project is using automatic reference counting如何确定我的项目是否使用自动引用计数
【发布时间】:2013-02-27 15:46:18
【问题描述】:

我遇到了一个问题,我在 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。我去构建设置并搜索自动引用计数,但找不到。

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

【问题讨论】:

  • 如果您能够编译对 autorelease 的调用,则不能使用 ARC。请注意,您可以为单个文件关闭/打开 ARC。

标签: objective-c memory-management automatic-ref-counting


【解决方案1】:

试试这个:

#if __has_feature(objc_arc)
/* ARC is used */
#endif

【讨论】:

  • 好的,我在您建议的 #if #endif 块中放置了一条 CCLOG 语句,但没有打印任何内容。所以我假设我没有使用ARC。这很不幸,因为这意味着我仍然有一个我无法解决的问题。
  • @JeffB6688 尝试使用-fobjc-arc 标志进行编译?这应该启用自动引用计数。
  • @AnoopVaidya 谢谢 :-)
  • @H2CO3 我想我会推迟这个。我需要找到问题的根源,因为我发现每次创建 box2D 主体/夹具时,都会遇到相同的内存管理问题。每个创建的 box2d 主体/夹具都会创建一个分配和自动释放的 Box2DSprite 对象。然后我的更新方法试图更新这个 box2d 精灵的位置,但是 Box2DSprite 里面有垃圾。但正如我所说,这与 SpaceViking 项目中使用的代码相同。非常令人沮丧。
  • @JeffB6688 确实如此。试着把对releaseautorelease的调用一一去掉,看看什么时候不会崩溃。然后你就有了一个起点:)
【解决方案2】:

尝试

[player release];

它应该给你“ARC Restrictions”错误

【讨论】:

  • 好的,谢谢。我也试过这个,我没有收到任何错误。所以我假设我没有使用ARC。这很不幸,因为这意味着我仍然有一个我无法解决的问题。
  • 这不是一个应该检查使用ARC的方式。
  • 检查的好方法:) 如何检查天堂是否真的存在? - 从埃菲尔铁塔跳下来检查。
  • @AnoopVaidya 搞定了:D
【解决方案3】:

您已经可以告诉您在没有 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 标志是否设置在每个文件级别。这是在 Build Phases ->在 Xcode 中选择项目和目标时编译源代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2014-02-01
    • 2015-09-29
    • 1970-01-01
    相关资源
    最近更新 更多