我正在爲正在編寫的項目編寫媒體播放器框架。這取決於VLC。我的一個班頭文件看起來像這樣從Objective-C框架頭文件中隱藏類型
#import <vlc/vlc.h>
@interface MediaPlayerVLC : MediaPlayer
{
libvlc_media_player_t *player;
libvlc_media_t *media;
}
@end
我需要在類的實例變量,而我需要的#import <vlc/vlc.h>
,因爲他們在那裏定義。但我不希望這個框架的用戶必須爲這兩種類型導入所有VLC的頭文件。我已經看到了圍繞這個問題的一些解決方案...
- 前向聲明,如
@class
。不幸的是,這些類型是typedef struct
類型,我似乎無法找到任何方式轉發宣告他們 - 將ivars聲明爲
void *
,然後在我想要使用它們時施放它們。如果可能的話,我希望避免這種情況,因爲我們失去了類型安全性,並且實現文件變得充滿了醜陋的表演。 我已經看到了這個在蘋果的框架...
@interface CAAnimation : NSObject <NSCoding, NSCopying, CAMediaTiming, CAAction> { @private void *_attr; uint32_t _flags; }
什麼
_attr
點?我想這將是一個ivars的結構,我很好奇這有什麼優點...- 這個類的兩個頭文件,一個public和一個private。私人看起來像上面那樣,公衆只會有
void *
指針。這非常難看,因爲我必須非常小心地保持它們的同步。
什麼被認爲是最佳實踐?有沒有我錯過的方法?
+1,因爲我何時可以在類擴展中聲明ivars?我一定錯過了。 – vikingosegundo 2012-01-07 14:36:12
我從蘋果的文檔中添加了一個片段,我希望你不介意。 – vikingosegundo 2012-01-07 14:44:40
當然不是問題。作爲參考,因爲非易碎實例變量(http://en.wikipedia.org/wiki/Objective-C#Non-fragile_instance_variables)支持已添加到LLVM。 – mattjgalloway 2012-01-07 14:45:58