2011-06-03 99 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