2009-04-09 25 views

回答

67

「不透明類型」是指您沒有structclass的完整定義的類型。在C,C++和Objective-C,你可以告訴一個類型將通過使用預先聲明後面定義編譯:

// forward declaration of struct in C, C++ and Objective-C 
struct Foo; 

// forward declaration of class in C++: 
class Bar; 

// forward declaration of class in Objective-C: 
@class Baz; 

編譯器沒有足夠的信息來讓你直接用做任何事structclass除了聲明它的指針,但這往往是你所需要做的。這允許庫和框架創建者隱藏實現細節。圖書館或框架的用戶然後調用助手函數來創建,操縱和銷燬宣稱爲structclass的轉發的實例。舉例來說,一個框架的創建者可以爲struct Foo實現這些功能:

struct Foo *createFoo(void); 
void addNumberToFoo(struct Foo *foo, int number); 
void destroyFoo(struct Foo *foo); 

爲核心的基礎架構的一部分,蘋果都會在平凡的Objective-C類似NSStringNSArrayNSBundle可通過不透明類型的C程序員。 C程序員使用指針和輔助函數來創建,操作和銷燬這些Objective-C類的實例。蘋果稱這種「免費橋接」。它們遵循一個通用的命名約定:「CF」前綴+類名+「Ref」後綴,其中「CF」代表「Core Foundation」,「Ref」代表「Reference」,表示它是一個指針。

+0

非常令人印象深刻的好回答!謝謝!! – Thanks 2009-04-10 10:39:31

13

不透明類型是一種「包裝」低級類型的類型,當底層實現很複雜時,或者用戶根本不需要知道內部運作時,經常使用它。蘋果對不透明類型的一個很好的頁面在這裏:

https://developer.apple.com/library/ios/#documentation/CoreFoundation/Conceptual/CFDesignConcepts/Articles/OpaqueTypes.html

例如,CFString字符串是一個不透明的類型,因爲它封裝了一個字符數組,維持其長度,其編碼等,但不直接讓用戶訪問這些值。而是提供訪問或操作內部字段並向用戶返回相關信息的方法。

2

這是一個未來申報的結構。例如:

typedef struct CFBundle *CFBundleRef; 

沒有「struct CFBundle」的實際定義,您的代碼無法訪問CFBundleRef指針內的任何內容。這是不透明的。

相關問題