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

Objective c 如何确定我的项目是否使用自动引用计数,objective-c,memory-management,automatic-ref-counting,Objective C,Memory Management,Automatic Ref Counting,我遇到了一个问题,我在cocos2D-box2D项目中使用的对象被垃圾覆盖。经过一段时间的调试,我发现如果以下行从 player = [[[Player alloc] initWithWorld:world atLocation:ccp(playerPositionX, playerPositionY)] autorelease]; 到 然后问题就消失了。这是非常令人困惑的,因为这段代码和底层类定义或多或少是学习Cocos2D书籍中描述的SpaceViking项目的代码副本 我突然想到,也许问

我遇到了一个问题,我在cocos2D-box2D项目中使用的对象被垃圾覆盖。经过一段时间的调试,我发现如果以下行从

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

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

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

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

尝试以下方法:

#if __has_feature(objc_arc)
/* ARC is used */
#endif
试试这个:

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

它应该会给您提供ARC限制错误

尝试

[player release];

它应该会给您提供ARC限制错误

您已经知道您正在构建没有ARC的系统:如果启用了它,您对autorelease的调用将导致编译器错误。这表明您的实际问题与ARC无关,当然-删除自动释放调用可能会阻止对象过度释放,但也很可能导致泄漏


除此之外,尽管:除了到目前为止建议的其他方法外,您还可以在Xcode中找到一个通常在项目或目标范围内控制ARC的位置。在navigator中选择您的项目,并在Build Settings选项卡中,在Apple LLVM Compiler 4.2-Language下查找Objective-C自动引用计数,或使用顶部的搜索框查找自动引用计数或ARC。如果您使用的是其他人最初设置的项目,您可能还希望检查是否在每个文件级别设置了-fobjc arc或-fno objc arc标志。当您的项目和目标在Xcode中被选中时,这是在构建阶段->编译源代码下进行的。

您已经可以知道您正在构建没有ARC的项目:如果启用了ARC,您对autorelease的调用将导致编译器错误。这表明您的实际问题与ARC无关,当然-删除自动释放调用可能会阻止对象过度释放,但也很可能导致泄漏


除此之外,尽管:除了到目前为止建议的其他方法外,您还可以在Xcode中找到一个通常在项目或目标范围内控制ARC的位置。在navigator中选择您的项目,并在Build Settings选项卡中,在Apple LLVM Compiler 4.2-Language下查找Objective-C自动引用计数,或使用顶部的搜索框查找自动引用计数或ARC。如果您使用的是其他人最初设置的项目,您可能还希望检查是否在每个文件级别设置了-fobjc arc或-fno objc arc标志。当您的项目和目标在Xcode中被选中时,这是在构建阶段->编译源代码下。

好的,我在建议的if endif块中放置了一条CCLOG语句,但没有打印任何内容。所以我假设我没有使用ARC。这是不幸的,因为这意味着我仍然有一个无法解决的问题。@JeffB6688尝试使用-fobjc arc标志编译?这将启用自动参考计数。@AnoopVaidya谢谢:-@H2CO3我想我会推迟这一步。我需要找到问题的根源,因为我发现每次创建box2D实体/夹具时,我都会遇到相同的内存管理问题。每个已创建的box2d实体/装置都会创建一个已分配并自动删除的Box2Sprite对象。然后我的更新方法尝试更新这个box2d精灵的位置,但是Box2DSprite中有垃圾。但正如我所说,这是太空海盗项目中使用的相同代码。非常令人沮丧。@JeffB6688确实如此。尝试逐个删除释放和自动释放的调用,然后查看它何时不会崩溃。然后您就有了一个起点:好的,我在建议的if endif块中放入了一条CCLOG语句,但没有打印任何内容。所以我假设我没有使用ARC。这是不幸的,因为这意味着我仍然有一个无法解决的问题。@JeffB6688尝试使用-fobjc arc标志编译?这将启用自动参考计数。@AnoopVaidya谢谢:-@H2CO3我想我会推迟这一步。我需要找到问题的根源,因为我发现每次创建box2D实体/夹具时,我都会遇到相同的内存管理问题。每个已创建的box2d实体/装置都会创建一个已分配并自动删除的Box2Sprite对象。然后我的更新方法尝试更新这个box2d精灵的位置,但是Box2DSprite中有垃圾。
但正如我所说,这是太空海盗项目中使用的相同代码。非常令人沮丧。@JeffB6688确实如此。尝试逐个删除释放和自动释放的调用,然后查看它何时不会崩溃。然后你有一个出发点:好的,谢谢。我也尝试过这个,我没有得到任何错误。所以我假设我没有使用ARC。这是不幸的,因为这意味着我仍然有一个我无法解决的问题。这不是一个人应该如何检查使用ARC。检查的好方法:如何检查天堂是否真的存在-从埃菲尔铁塔跳下来检查一下。@AnoopVaidya把它钉牢了:好的,谢谢。我也尝试过这个,我没有得到任何错误。所以我假设我没有使用ARC。这是不幸的,因为这意味着我仍然有一个我无法解决的问题。这不是一个人应该如何检查使用ARC。检查的好方法:如何检查天堂是否真的存在-从埃菲尔铁塔跳下来检查。@AnoopVaidya搞定了:如果你能编译一个自动释放调用,你就不能使用ARC。请注意,您可以为单个文件关闭/打开ARC。如果您能够编译对autorelease的调用,则不能使用ARC。请注意,可以为单个文件关闭/打开圆弧。