2014-02-18 3 views
0

이것은 기본적인 질문 일지 모르지만 일반적으로 코코아와 Objective-C 및 OOP를 처음 접했고 이에 대한 답을 찾을 수 없었습니다.다른 방법으로 액세스 할 수있는 단일 개체를 만들 수 있습니까?

내가 쓰고있는 응용 프로그램에서 사용자가 특정 버튼을 누를 때마다 소리 파일을 재생하고 싶습니다. 나는 그것을 위해 NSSound를 사용하고 구현하는데 문제가 없다. 파일 재생이 완료되기 전에 사용자가 버튼을 반복해서 클릭하면 때문에 나를 위해 문제가

- (IBAction)playSound:(id)sender { 
    NSSound *sound = [[NSSound alloc] initWithContentsOfFile:kSoundFilePath byReference:YES]; 
    [sound play]; 
} 

: 문제는 내가 단지 버튼을 누를 때마다 객체 새로운 NSSound를 작성하여 그 방법을 알고있다 , 그것은 NSSound의 새로운 인스턴스를 생성 할 것이고, 그들은 모두 서로의 위에 놀 것이고, 나는 그것을 원하지 않습니다. 해당 메서드 밖에 NSSound 개체를 만들 수있는 방법이 있습니까 및 NSSound 다시 재생하려면 말하기 전에 재생중인 경우 보려면 단추 검사 IBAction 메서드가 있습니까?

+0

sharedInstance/singleton은 어떻습니까? – Larme

+0

좋은 접근 방법이 아닙니다. 그는 생성 된 후에 변수를 저장하기를 원하며 하나의 사운드 객체 ​​만 허용하지 않습니다. – SevenBits

답변

1

예세르. 이것은 여러 가지 방법으로 수행 할 수 있습니다. 한 가지 쉬운 방법은 사유 재산을 사용하는 것입니다.

/* these are in the SAME FILE */ 
@interface MyClass() 

    @property (nonatomic, retain) NSSound *sound; 

@end 

@implementation MyClass 

    - (IBAction)playSound:(id)sender { 
     self.sound = [[NSSound alloc] initWithContentsOfFile:kSoundFilePath byReference:YES]; 
     [self.sound play]; 
    } 

@end 

이렇게 할 수도 있습니다. 편집 : Avt는 주석에서 언급했듯이 전역 변수를 자신의 방식으로 사용할 때 몇 가지 문제가 있습니다. 이이 클래스의 인스턴스를 여러 개 생성하는 경우 singleton design pattern을 사용하는 것이 좋습니다. 설명하려면 여기 an article by the venerable Mattt Thompson입니다. 이 클래스는 생성 된 객체를 소유 프로그래밍 관점에서 좀 더 명확하게하기 때문에

@implementation MyClass 

    NSSound *sound; 

    ... 

    - (IBAction)playSound:(id)sender { 
     sound = [[NSSound alloc] initWithContentsOfFile:kSoundFilePath byReference:YES]; 
     [sound play]; 
    } 

@end 

는 개인적으로 첫 번째 방법을 사용합니다. 두 번째 방법은 합법적이지만 객체가 어디에 속하는 지에 대해서는 덜 분명합니다 ... 메소드의 범위에서 로컬 변수가 될 수도 있고 다른 것일 수도 있습니다. I 은 첫 번째 방법으로을 적극 권장하지만 교육의 목적으로 모든 가능한 방법을 알아야합니다.

@implementation MyViewController 

이 추가 :

@implementation MyViewController { 
    NSSound* sound; 
} 

을 그리고있는 viewDidLoad에서 :

sound = [[NSSound alloc] initWithContentsOfFile:kSoundFilePath byReference:YES]; 

그리고 마지막으로을의 모양은 클래스의 선언에서 위로

+0

속성을 생성하는 것 외에도 액션이 - (BOOL) isPlaying으로 전송 될 때 사운드가 여전히 재생 중인지 확인할 수 있습니다. – Cory

+0

매우 사실이지만 코드를 변경하지는 않을 것입니다. 질문. – SevenBits

+0

-1 이것은 작성자의 문제를 해결하지 못하기 때문에 발생합니다. 새로운 NSSound 객체를 생성하고 재생하기 전에와 동일합니다. 속성에 저장하지만 저장된 개체는 사용되지 않습니다. – Avt

0

:

- (IBAction)playSound:(id)sender { 
    [sound play]; 
}