2012-12-19 32 views
0

我的目标是建立一个框架,但不向公众头包封物的属性和方法

点的一些方法和属性是框架已经一切内置的,但不同的版本必须具备的一些性质和方法隐藏

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

在我看来,应该是这样的:

@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或更高版本中可用

有谁知道该怎么做?

回答

1

你可以用预编译的步骤做:

一)在项目的每一个buildTarget创建一个类似的版本(#define VERSION 1.0一个#def值)。每个buildTarget应该有不同的版本,并且会代表FW的不同版本。要做到这一点去的项目选择,构建目标选项 - >建立设置 - >预编译宏

B)创建一个预编译器之类的函数大于: #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 

你认为解决您的问题。

如果你这样做,预编译器将跳过他的版本下的代码

+0

非常感谢你的答案!它看起来是正确的,除非预编译器从构建中采用道具和方法,那么我的代码可能无法工作。目标是从标题中提取它们,但将它们留在构建中。无论如何,我非常感谢你的帮助,让我检查这是否适合我。 – Ezeki

+0

我的建议是,如果它是属性,你可以用这个方法在头文件中声明它并实现它,而不是合成它。要声明变量,你可以在.m文件中使用扩展名。对于这些方法,我认为它可以帮助你...您可以使用预编译器将'@ private'放在最佳位置。我对答案进行了修改...... – Jpellat

+0

对不起,我们忘记了这一点....我们不能使用私有方法,只能使用声明值...但是您可以在.m中声明的扩展名上有条件地创建它... – Jpellat