2012-01-07 2 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 유형입니다. 앞으로 선언 할 방법을 찾을 수 없습니다.
  • 이바라기를 void *으로 선언 한 다음 사용할 때마다 캐스트합니다. 가능한 경우이 문제를 피하고 싶습니다. 유형 안전을 잃고 구현 파일이 추악한 캐스트로 가득 차게됩니다.
  • 나는 애플의 프레임 워크에서 본 적이

    ...에 _attr 점을 무엇

    @interface CAAnimation : NSObject <NSCoding, NSCopying, CAMediaTiming, CAAction> 
    { 
    @private 
        void *_attr; 
        uint32_t _flags; 
    } 
    

    ? 나는 그것이 ivars의 구조체 일 것 같아요,이게 어떤 이점이 있는지 궁금합니다. ...

  • 두 개의 헤더 파일 (공개 및 개인)이 있습니다. 개인적인 것은 위와 같을 것이고 대중은 단지 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

+0

사과의 문서에서 발췌 문장을 추가했습니다. – vikingosegundo

+0

물론 문제는 아닙니다. 참고로 그것은 취약하지 않은 인스턴스 변수 (http://en.wikipedia.org/wiki/Objective-C#Non-fragile_instance_variables)가 LLVM에 추가 되었기 때문입니다. – mattjgalloway

2

당신은 또한 당신의 클래스의 @implementation 섹션에서 인스턴스 변수를 선언 할 수있는 최신 컴파일러로

@implementation Something 
{ 
    int a; 
} 
3

처럼 구현 인스턴스 변수를 넣을 수 있습니다 :

// MediaPlayerVLC.m 

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

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

... 

@end 
+0

할 수 있습니까? 결코 들어 본적이 없다. 미친 물건 ... 알았어. –

관련 문제