【问题标题】:Xcode: Copy Headers: Public vs. Private vs. Project?Xcode:复制标头:公共与私有与项目?
【发布时间】:2011-09-16 01:18:39
【问题描述】:

我正在构建一个 Cocoa Touch 静态库。我应该如何决定是将头文件复制为公共、私有还是项目?

【问题讨论】:

    标签: xcode header static-libraries


    【解决方案1】:

    Public:界面已完成,旨在供您产品的客户使用。产品中包含一个公共标头作为可读源代码,没有任何限制。

    私有:该界面不适合您的客户,或者处于开发的早期阶段。产品中包含一个私有标头,但它被标记为“私有”。因此,这些符号对所有客户端都是可见的,但客户端应该明白他们不应该使用它们。

    项目:该接口仅供当前项目中的实现文件使用。项目标头不包括在目标中,除了在目标代码中。客户根本看不到这些符号,只有您才能看到。

    来源: Xcode Developer Library > Tools & Languages > IDEs > Project Editor Help > Setting the Visibility of a Header File

    【讨论】:

    • Randy - 您应该将 Power 的答案合并到您的答案中,使其成为更好的单一答案,恕我直言。
    • 这是不正确的。苹果可能已经记录了这一点——但他们没有实施。 “公共”标题将阻止您分发您的应用程序(Xcode 中的错误),除非您解耦您的项目(不嵌入项目文件!)
    • 有谁知道 XCode 5 中的头文件选项到底在哪里?!
    • @mindbomb 您可以在文件检查器中的“目标成员”下找到它们。
    【解决方案2】:

    Randy 的回答很好,并为您提供了所有相关背景。我想添加一些信息来帮助您根据您对图书馆的使用方式的期望。

    项目:如果您正在分发您的项目,并希望用户将您的项目作为子项目包含在他们自己的项目中,您应该确保将您的标头标记为“项目”。不这样做会导致这样的问题: Xcode 4 Archive Version Unspecified

    请注意,这适用于每个子项目...包括子项目的子项目,递归。

    PUBLIC:如果您希望您的库的用户仅链接到您的对象(而不是您的原始项目),请确保您的标题被标记为“公共”(仅适用于他们的标题)需要参考)。

    【讨论】:

    • 这里最重要的一点是要记住:由于上面提到的错误(xcode 中的错误),Apple 目前无法简单地“分发库”并让您的用户决定如何使用它:如果一个库有公共头文件,并且是嵌入的,Xcode 归档器会在没有解决方法的情况下中断)
    • @Adam,如果您在谈论 Xcode 中的错误,请提供版本号。所以答案会存在很长时间,现在的错误不会成为 $SOME_RELEASE 之后的错误。
    • @JamesMoore SO 旨在很好地应对随时间变化的答案 - 我在这里没有看到问题。除此之外……当 Apple 开始为 Xcode 发布发行说明(我相信大多数 Xcode 更改在 Apple 发布之前已从发行说明中删除),并开始承认已知错误时,我们将有时间手动进行这些更新。在那之前,不断地编辑和重新编辑和重新检查与 Xcode 上的主要错误相关的许多 SO 帖子是非常费力的。
    • @JamesMoore ... 版本?所有从 1 到 5.1 并且还在计数。在过去的 12 个月中,我报告了这个和其他 20 个类似的错误。一个新版本的 Xcode (5) 发布了,作为奖励,我们仍然有所有的错误。我的一些错误被标记为重复,没有做任何事情。他们决定改为改进界面。今天,我的 Xcode 5.1 崩溃了 12 次......而且还在继续。
    • @William Power 如果一个公共头包含一个头文件 HeaderB.h,而 HeaderB.h 包含另一个头文件 HeaderC.h,那么 HeaderB.h、HeaderC.h 的可见性应该是多少。据我所知,所有在公共头文件中可见但不会直接包含在项目中的头都将被标记为私有,并且这些私有头中包含的所有头都可以标记为项目头。我正在链接库而不是将其包含为子项目。
    【解决方案3】:

    Objective-C 标头:公共、私有、项目

    [Objective-C static library manual]
    [Target Membership]

    public - 向消费者公开的 API

    private - 向消费者公开但使用它有风险的 API

    project - API 对消费者不可见。一种模块级别的封装

    文件结构

    ClassA.h - public
    ClassB.h - project
    ClassC.h - private
    

    Headers 文件夹设置者:

    Public Headers Folder Path(PUBLIC_HEADERS_FOLDER_PATH)
    //default value is
    $(CONTENTS_FOLDER_PATH)/Headers
    

    PrivateHeaders 文件夹设置者:

    Private Headers Folder Path(PRIVATE_HEADERS_FOLDER_PATH)
    //default value is
    $(CONTENTS_FOLDER_PATH)/PrivateHeaders
    

    1.要为 Objective-C 或 Swift 消费者公开 Objective-C 代码,您应该使用 .modulemappublic 标头

    //Swift
    import SomeModule
    
    //Objective-C
    @import SomeModule;
    

    [.modulemap] -> 仅公共标头或错误

    2.为Objective-C使用者公开Objective-C代码,使用非模块

    //Objective-C
    
    //umbrella
    #import <ObjCFramework/ObjCFramework.h>
    
    //specific руфвук
    #import <ObjCFramework/ClassA.h>
    //#import <ObjCFramework/ClassB.h> //error
    #import <ObjCFramework/ClassC.h>
    

    当您导入项目标题时,您会得到

    Showing All Messages
    'ObjCFramework/ClassB.h' file not found
    

    【讨论】:

      猜你喜欢
      • 2013-01-31
      • 2011-01-17
      • 1970-01-01
      • 2011-06-18
      • 2011-01-05
      • 1970-01-01
      • 1970-01-01
      • 2017-11-16
      • 2014-10-07
      相关资源
      最近更新 更多