2011-06-03 55 views
0

我正在为iOS的静态库工作,并且希望实现一些公共的供库中其他类使用的方法,但不能从外部看到。基本上,我想创建类似于Apple的“私人”API调用的东西。iOS静态库和方法隐藏

我很确定有人能够调用这些方法,因为他们发现了他们的名字,但我只是想将它们与头文件一起封装在库中,以便XCode不会给他们选项默认情况下调用这些方法,可能会引发警告。

任何想法如何实现?

回答

6

一个想法如下 - 您可以在单独的.h文件的单独类别中定义类的“私有”方法。例如,你可以有A类看起来像下面:

@interface A : NSObject { 
} 
- (void) foo; //public method 
@end 

现在私人A的方法可以在不同的文件中声明:

A + Internal.h

@interface A (Internal) 

- (void) bar; //private method 

@end 

A (A.m)的实现文件可以具有这两组方法的实现。

在您的静态库中,您不会发布名称中包含"+Internal"的头文件。您的库的用户只能看到A.h中的方法,但库中的类可以同时使用这两个方法。

+3

记住,编译器将不检查是否在类中声明的方法实际上是实现与否。如果这是一个问题,您可以改为使用类扩展。类扩展与匿名类相似,只不过它们声明的方法必须在相应类的主@implementation块中实现。 – albertamg 2011-06-03 15:35:01

+0

这工作完美! @albertamg谢谢您的澄清。我必须先把它交给@Tejas先回答。 – brandontreb 2011-06-03 15:47:38

+0

@brandontreb够公平:) – albertamg 2011-06-03 15:51:18

5

您可以在.m文件顶部或其专用头文件中的category@interface MyClass(PrivateMethods)或类扩展名@interface MyClass()中声明您的“私有”方法。

Extensions

类扩展是像匿名类,除了它们声明的方法必须在对应的类主@implementation块来实现。

一个类通常具有一个公开声明的API,然后有私人声明的其他方法仅供类或该类所在的框架使用。如上所述,您可以在私有头文件或实现文件中的类别(或多于一个类别)中声明这些方法。这可以工作,但编译器无法验证所有已声明的方法是否都已实现。

类扩展允许您为位于主类@interface块之外的位置的类声明附加的必需方法。

参见: Best way to define private methods for a class in Objective-C