2012-01-07 19 views
3

我正在爲正在編寫的項目編寫媒體播放器框架。這取決於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 *指針。這非常難看,因爲我必須非常小心地保持它們的同步。

什麼被認爲是最佳實踐?有沒有我錯過的方法?

回答

3

您可以使用類擴展。你應該嘗試這樣做:

MediaPlayerVLC.h:

@interface MediaPlayerVLC : MediaPlayer 
{ 
} 

@end 

MediaPlayerVLC.m:

#import "MediaPlayerVLC.h" 
#import <vlc/vlc.h> 

@interface MediaPlayerVLC() 
{ 
    libvlc_media_player_t *player; 
    libvlc_media_t *media; 
} 

@end 

@implementation MediaPlayerVLC 

// The implementation 

@end 

Apple's docs

類的外延都喜歡匿名類,除了他們聲明的 方法必須在主@implementation中實現塊爲相應的類。
使用Clang/LLVM 2.0編譯器, ,您還可以聲明類 擴展中的屬性和實例變量。

這是使用類擴展類別在實現文件中聲明額外的ivars。

+0

+1,因爲我何時可以在類擴展中聲明ivars?我一定錯過了。 – vikingosegundo 2012-01-07 14:36:12

+0

我從蘋果的文檔中添加了一個片段,我希望你不介意。 – vikingosegundo 2012-01-07 14:44:40

+0

當然不是問題。作爲參考,因爲非易碎實例變量(http://en.wikipedia.org/wiki/Objective-C#Non-fragile_instance_variables)支持已添加到LLVM。 – mattjgalloway 2012-01-07 14:45:58

2

你可以把高德在執行類似

@implementation Something 
{ 
    int a; 
} 
3

與最新的編譯器,你也可以在你的類的@implementation部分聲明的ivars:

// MediaPlayerVLC.m 

#import "MediaPlayerVLC.h" 
#import <vlc/vlc.h> 

@implementation MediaPlayerVLC 
{ 
    libvlc_media_player_t *player; 
    libvlc_media_t *media; 
} 

... 

@end 
+0

你可以嗎?從來沒有聽說過。瘋狂的東西......很高興知道。 – 2012-01-07 23:00:26