2010-05-26 37 views
2

我創建靜態庫使用以下指南分享到: http://www.amateurinmotion.com/articles/2009/02/08/creating-a-static-library-for-iphone.htmliPhone靜態庫:如何隱藏實例變量

在功能之一,我返回「SomeUIView」這是UIView的子類並且在公共頭文件中定義,但是我不想在公開頭文件中公開SomeUIView的內部實例變量。

我試過對SomeUIView的私人內部頭文件使用類別,但我一直運行到「類'SomeUIView'的重複接口聲明」。

有誰知道如何做到這一點?

謝謝!

回答

3

類別和擴展無法將實例變量添加到類中。我會去PIMPL方法在這裏 - 使用私有對象的實現:

// header 
@class MyObjImpl; 
@interface MyObj { 
    MyObjImpl* impl; 
} 
@end 

// implementation file: 
@interface MyObjImpl { 
    id someIvar; 
} 
// ... 
@end 

// ... etc. 

這也讓你的公共接口在穩定的情況下,你要添加的東西供內部使用。

「重複接口」來自缺少括號在第二個接口聲明:

// header: 
@interface MyObj 
// ... 
@end 

// implementation file: 
@interface MyObj() // note the parentheses which make it a class extension 
// ... 
@end 
+0

注意,一個私有實現(...我第二喜歡的縮寫旁邊NARC一個疙瘩),贏得實際上隱藏了ivars ......如果你在運行時足夠挖掘,你仍然可以得到它們。 – bbum 2010-05-26 00:43:34

0

你也可以使用被稱爲「聯想參考」 Objective-C的2功能。

這不是真正的面向對象的API,但你可以通過運行一些簡單的功能添加/刪除對象到另一個對象:

void objc_setAssociatedObject(id object, void * key, id value) 

設定值或時價值爲零將其刪除。

id objc_getAssociatedObject(id object, void * key) 

檢索指定鍵的值。

請注意,這也是在實現類別時將「實例變量」添加到現有對象的一種方法。

主要是S簡單指向私有變量,你可以通過使用作爲一個模塊私有聲明:

static char SEARCH_INDEX_KEY = 0;