【问题标题】:Encapsulate properties and methods in framework header files在框架头文件中封装属性和方法
【发布时间】:2012-12-07 00:47:27
【问题描述】:

我的目标是构建一个框架,但在公共标头中隐藏一些方法和属性

重点是framework什么都内置了,但是不同的版本肯定隐藏了一些属性和方法

我正在寻找一些方法来从构建的标头中删除一些标记的属性,或者避免在构建阶段添加它们。

在我看来应该是这样的:

@interface MyClass

@property (strong, nonatomic) SomeClass1* instance1;

#AVAILABLE FROM 1.0.2
@property (strong, nonatomic) SomeClass2* instance2;

#AVAILABLE FROM 1.0.3
@property (strong, nonatomic) SomeClass3* instance3;

- (void) method1;

#AVAILABLE FROM 1.0.3
- (void) method2;

@end

所以如果我将一些预定义的版本值或项目版本值(并不重要)设置为 1.0.2
那么 instance1、instance2 和 method1 应该在框架头文件中,但是
instance3 和 method2 将仅在 1.0.3 或更高版本中可用

有人知道怎么做吗?

【问题讨论】:

    标签: objective-c ios frameworks private encapsulation


    【解决方案1】:

    您可以通过预编译步骤来做到这一点:

    a) 在项目中为每个 buildTarget 创建一个 #def 值,例如 version(#define VERSION 1.0)。每个 buildTarget 都应该有一个不同的版本,并且代表你的固件的不同版本。为此,请转到项目选项,构建目标选项-> 构建设置-> 预编译器宏

    b) 创建一个预编译器函数,例如 GREATER THAN: #define SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(v) v>= VERSION(可以在.pch中定义)

    c) 在标题处放置

      #if (SYSTEM_VERSION_GREATER_THAN_OR_EQUAL_TO(1.0.2))
      property (strong, nonatomic) SomeClass2* instance2;
      #endif
    

    你认为这能解决你的问题吗?

    如果你这样做,预编译器会跳转到他的版本下的代码

    【讨论】:

    • 非常感谢您的回答!它看起来对我来说是正确的,除非预编译器从构建中获取道具和方法,那么我的代码可能无法工作。目标是从标题中获取它们,但将它们留在构建中。无论如何,我非常感谢你的帮助,让我看看这是否适合我。
    • 我对你的建议是,如果它是属性,你可以用这个方法在头文件中声明它并实现它而不是合成它。要声明变量,您可以在 .m 文件的扩展名中进行。对于方法,我认为它可以帮助您...您可以使用预编译器将@private 放在好的位置。我改变了答案...
    • 抱歉忘记了......我们不能将私有用于方法,只能用于声明的值......但您可以根据.m中声明的扩展有条件地创建它......
    • 我最终在构建阶段得到了一个批处理脚本,该脚本在框架标题中搜索标记的块并将其删除,因此用户无法看到它们,但我的框架仍然可以使用它们。我在 .pch 中使用了您的预定义想法,因此您的回答对我有所帮助。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2011-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多