【问题标题】:Xcode - Same class name, two targetsXcode - 相同的类名,两个目标
【发布时间】:2012-09-03 01:56:42
【问题描述】:

我正在尝试重新组合我在同一个 Xcode 项目中的多个应用程序。于是我新建了一个 Xcode 项目并添加了两个目标,并将我的两个应用程序的源代码导入其中一个目标中。

问题是我在两个应用程序中有同名的类。当我编译第一个时,没问题。但是如果我尝试编译第二个目标,我会遇到很多这样的问题:

In file included from /Users/administrateur/Documents/Merged_iPhone_Projects/Target2/Classes/VisitFormViewController.m:18:
In file included from /Users/administrateur/Documents/Merged_iPhone_Projects/Target1/Classes/VisitFormDetailsViewController.h:11:

/Users/administrateur/Documents/Merged_iPhone_Projects/Target1/Classes/RoundedCornersTableViewCell.h:18:61: error: property has a previous declaration
@property (nonatomic, readonly) BkCustomCellBackgroundView *roundedCornersView;
                                                            ^
Target2/Classes/RoundedCornersTableViewCell.h:18:61: note: property declared here
@property (nonatomic, readonly) BkCustomCellBackgroundView *roundedCornersView;

我尝试谷歌搜索,发现将“标题搜索路径”设置为$(SRCROOT)/Target1(或$(SRCROOT)/Target2)应该可以解决我的问题,但这不起作用。

有人有其他解决方案吗?

仅供参考,我使用的是 Xcode v.4.4.1

【问题讨论】:

  • 这里是另一个答案,点击这个链接:stackoverflow.com/questions/2596695/…试试看,告诉我它是否有效!
  • 谢谢@AlexLee,我会试试的
  • 我尝试按照您发送给我的链接中的说明将 HEADERMAP_INCLUDES_FLAT_ENTRIES_FOR_TARGET_BEING_BUILT 设置为 NO,但问题仍然存在。
  • 我尝试了另一件事。将 USE_HEADERMAP 设置为 NO,并在“标题搜索路径”部分添加 $(SRCROOT)/Target1(或 2),这样就可以了!我现在的问题是,我是否会因为这个用户定义的设置而被 Apple Store 拒绝。

标签: xcode class xcode4 target


【解决方案1】:

您应该按目录安排每个目标的资源,并在文件检查器中定义目标成员。

此外,对于每个目标,您都可以使用未记录的“用户构建设置”:

USE_HEADERMAP = 否

并在每个目标“用户标头搜索路径”变量中设置标头目录位置。

如需更多信息和更详细的解释, 请参考stackoverflow中的这个问答

controlling which project header file Xcode will include

【讨论】:

  • 这很有效,让我可以在两个不同的目标中拥有两个具有相同名称的不同类。但现在我无法使用 Refactor > Rename 重命名其中一个类而不重命名另一个类。
【解决方案2】:

这些类需要不同的名称——否则,加载时会发生冲突,并且未指定您将收到的实现。

【讨论】:

  • 最令人惊奇并展示了 xcode 是多么糟糕的是 Xcode 创建的类的类冲突,例如 AppDelegate。这是,至少,一个 5 岁的错误。 Xcode 的设计充满了仇恨和不屑,这是可悲的。
  • @SpaceDog ObjC 类名存在于全局命名空间中。这允许您通过运行时查找类接口并按名称创建实例,但有一些注意事项——加载冲突和复杂的前缀是显而易见的。
  • 这毫无意义:我有两个同名的类,但一个分配给一个目标,另一个分配给另一个目标。没有发生冲突的原因,只是糟糕的实现,但这是 xcode 的另一个同义词。 ?
  • 你错了。不同的目标不会一起编译,因此在运行时名称冲突是不可能的。
  • @Andy 这些独立的同名类的实现存在于不同的图像/二进制文件中。例如,您的应用程序和直接或间接加载的框架或库。事实上,随着其中一些库的更新,名称集可以更改。假设你的应用在几年前实现了一个名为WKWebView 的类。现在 Apple 发布了WKWebView——就像在 WebKit 类中一样。一旦更新的WebKit 和您的应用程序的类加载,就会遇到冲突。此外,还有许多私有类可以冲突。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-20
  • 2020-11-29
  • 2015-12-15
相关资源
最近更新 更多