【问题标题】:ARC conversion issue, does it recognize Extensions?ARC 转换问题,它可以识别扩展吗?
【发布时间】:2012-06-29 13:26:57
【问题描述】:

我正在将我的 Objective-C Cocos2d 项目转换为 ARC,并且在尝试转换扩展了其他一些类的第三方类时发现了一些问题。

以下是我收到的 ARC 错误消息:

问题中显示的静态方法是在 SneakyExtension.h 文件中定义的,该文件以这种方式扩展了一些其他类(SneakyButton、SneakyButtonSkinnedBase、SneakyJoystick..)(我只共享接口,因为代码由 Steffen Itterheim 复制) :

@interface SneakyButtonSkinnedBase (Extension)
+(id) skinnedButton;
@end

@interface SneakyJoystick (Extension)
+(id) joystickWithRect:(CGRect)rect;
@end

@interface SneakyJoystickSkinnedBase (Extension)
+(id) skinnedJoystick;
@end

您可以在这里找到源代码:look at the ShootEmUp03 example in chapter 8

我唯一的猜测是 ARC 不知何故不支持 Extension 关键字,但我觉得我错了,因为我在 google 和 Stackoverflow 上都没有找到太多相关信息或“过渡到 ARC”Apple 的 iTunes U 教程。

任何帮助将不胜感激。

【问题讨论】:

  • 您确定要为 SneakyJoystick 类和扩展导入 .h 文件吗?
  • @PhillipMills 是的,你太棒了。我认为它没问题,因为它运行没有问题(在尝试转换之前)。现在我直接导入了“SneakyExtensions.h”,它导入了所有其他头文件,这很好(现在需要检查下一个 ARC 错误,但这是一个单独的业务)。我无法安静地理解它之前是如何运行的……有什么提示吗?你想发表你的评论作为答案,我会接受它以便你得到一些分数吗?

标签: objective-c ios xcode extension-methods automatic-ref-counting


【解决方案1】:

导入所需文件。 :-)

我对它为什么起作用的最佳猜测是编译器现在比以前更注重正确的声明。为什么会这样,我不知道。不过,最终,运行时会获得对什么有效的最终投票,只要确实有一个 joystickWithRect 方法链接到您的应用程序,即使它应该,您在功能上也没有问题> 根据某些标准,在早期版本中一直是编译器错误。

你现在遇到的并不影响程序的行为;这只是编译器试图确保你告诉它正确的事情。

【讨论】:

  • ARC 需要查看方法声明来推断方法的返回值和内存管理影响。
【解决方案2】:

在 ARC 下编译时,joystickWithRect 方法需要公开声明并导入,供您使用。编译器需要访问方法声明,因为它可以使用像 NS_RETURNS_RETAINED 这样的属性来定义,它会更改编译器需要生成的保留/释放调用。

以前,由开发人员负责处理保留和释放,因此编译器允许您调用选择器,即使它们之前没有被声明。

【讨论】:

  • 感谢您的回答。 +1。我还没有接受它作为最终结果,因为 Phillip 之前在他的评论中提供了一个类似的正确答案,但我很高兴这两种解释,我非常感谢你的贡献(赞赏)。
  • 没问题,请注意,此错误与 ARC 相关,而不是像其他答案所暗示的那样是更严格的编译器的结果。
  • 谢谢,我会尽量了解 ARC。除了 iTunes U 材料和 apple.developer 之外,你有没有找到任何好的指南?
  • 我会在developer.apple.com/videos观看一些 WWDC 2011 视频
  • 是的,我见过一些,但可能我需要再研究一下:),谢谢
猜你喜欢
  • 2022-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-03
  • 2014-04-21
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
相关资源
最近更新 更多