【问题标题】:Possible to hide method implementation in library?可以在库中隐藏方法实现吗?
【发布时间】:2009-11-19 23:14:23
【问题描述】:

我想知道是否可以对静态库的消费者隐藏库实现。

这个很棒的帖子引发了一些关于静态库许可系统的问题:Licensing system for static library。我想使用的方案是:

  • 向消费者提供他们放入 plist 的许可证密钥
  • plist 已部署
  • 强键是根据包标识符生成的,并与 plist 中的键匹配

这就是该系统存在缺陷的原因:我需要运行一个算法(用于动态生成强密钥),然后输出一些字符串。问题是我必须包含要使用的库的头文件。此时,任何使用该库的人都可以进入实现。如果我有一个名为 checkLicense() 的方法,该库的使用者可以进入该方法并查看强密钥是如何生成的。

另外,对于静态方法,我是否每次都运行密钥生成,因为没有任何状态?我可能可以使用单例并在每个静态方法调用中调用它?

我的主要问题是,如果您有头文件,则可以在静态库中看到实现。有什么方法可以隐藏实现吗?

【问题讨论】:

    标签: iphone objective-c cocoa-touch xcode


    【解决方案1】:

    假设您正在创建的这个静态库是用 Objective-C 编写的,您可以使用的一种方法是在您的实现文件(而不是您的头文件)中创建您的类的 anonymous 类别。在该类别中,声明您的敏感方法,然后像往常一样在您的类中实现它们。这样您就不必在公共标头中公开这些方法。

    例如在SomeClass.m:

    @interface SomeClass (/*Secret stuff*/)
    - (BOOL)validateRegistration:(NSData *)key;
    @end
    
    
    @implementation SomeClass
    
    // Other methods....
    
    - (BOOL)validateRegistration:(NSData *)key { /* ... */ }
    
    @end
    

    请注意,这是一个匿名类别,因为我没有为该类别命名(这只是括号内的注释)。这样您就不必专门为该类别的实现声明单独的实现块,这有助于进一步隐藏这些方法。

    【讨论】:

    • 来自想要使用该库的人,他们如何访问没有标题的任何函数?如果他们输入 [SomeClass DoThis],他们不会得到任何代码提示,并且编译器会抱怨未定义(未声明?)类。你有一个链接解释它是如何工作的吗?实际上,我认为 Joe Hewitt 的 320 项目就是这样做的。没有头文件,但你可以使用它的方法。您是否有讨论该技术的链接?在那种情况下,它不是库而是捆绑包对吗?
    • 啊,我想我误解了你的问题。我正在编辑我的回复。
    • 也许我做错了什么,但我仍然可以进入 validateRegistration 的实现。我还有一个只声明接口的头文件(否则它不会编译)。没有方法
    • 其实我觉得也没那么复杂。我在静态库项目的子文件夹中有主机应用程序。一旦我将所有静态库文件移到另一个文件夹中,Xcode 就无法再找到它们,我也无法进入实现。我认为不需要匿名类别。这跟你有关系吗?
    • @4thSpace:允许源代码级调试的不是标头,而是调试符号。然而,即使没有这些,也可以在汇编级别进行调试。此外,您仍然可以调用未声明的方法,尽管它们被假定为可变参数 (developer.apple.com/mac/library/qa/qa2005/qa1405.html) 并返回 id
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2019-10-31
    相关资源
    最近更新 更多