【发布时间】:2012-01-07 14:17:25
【问题描述】:
我正在为我正在进行的项目编写媒体播放器框架。这取决于 VLC。我的一个类的头文件如下所示
#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 *,然后在我想使用它们时将它们转换。如果可能的话,我想避免这种情况,因为我们失去了类型安全性并且实现文件变得充满了丑陋的演员表。 -
我在 Apple 的框架中看到过这种情况...
@interface CAAnimation : NSObject <NSCoding, NSCopying, CAMediaTiming, CAAction> { @private void *_attr; uint32_t _flags; }_attr指向什么?我想这将是一个 ivars 的结构,我很好奇这有什么优势...... - 类的两个头文件,一个是公共的,一个是私有的。私有的看起来像上面那样,而公众只有
void *指针。这很难看,因为我必须非常小心地让它们保持同步。
什么是最佳实践?有没有我错过的方法?
【问题讨论】:
标签: objective-c cocoa frameworks header-files