0

この質問は Objective-C の初心者からのものですので、ご容赦ください。クラスでサウンドを作成しようとしていますが、NSSound ではなく NSBeep() を使用して成功しています。ここに例があります。「main.m」プログラムでは問題なく動作しますが、SoundMaker クラスでしか動作しないことNSBeep();に注意してください。NSSound を動作させる方法を学ぶ上での助けは大歓迎です。[[NSSound soundNamed:@"Frog"] play];NSBeep();

main.m:

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>
#import "SoundMaker.h"

int main() {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    NSLog(@"This is the main program.");
    NSBeep(); // Works fine.
    sleep(1);
    [[NSSound soundNamed:@"Frog"] play]; // Works fine.
    sleep(1);
    [SoundMaker makeSound]; // Only NSBeep() works.

    [pool drain];
    return 0;
}

SoundMaker.h:

#import <Foundation/Foundation.h>
#import <AppKit/AppKit.h>

@interface SoundMaker : NSObject
+(void) makeSound;
@end

SoundMaker.m:

#import "SoundMaker.h"

@implementation SoundMaker
+(void) makeSound
{
    NSLog(@"This is SoundMaker.");
    NSBeep(); // Works fine.
    sleep(1);
    [[NSSound soundNamed:@"Frog"] play]; // Doesn't work.
}
@end
4

3 に答える 3

1

前述のように、解決策はsleep(...);次のステートメントを追加することNSSoundです。動作するSoundMaker.mへの変更は次のとおりです。

#import "SoundMaker.h"

@implementation SoundMaker
+(void) makeSound
{
    NSLog(@"This is SoundMaker.");
    NSBeep(); // Works fine.
    sleep(1);
    [[NSSound soundNamed:@"Frog"] play]; // Works fine.
    sleep(1); // This added statement allows the preceding "play" message to work.
}
@end
于 2011-04-07T22:54:01.970 に答える
0

Xcodeでブレークポイントを設定するとヒットしますか?

私は最近始めたばかりなので、 +(void) は奇妙に見えます。私が使っている本は教えるだけです

- (return_variable)methodname

[編集]

私はちょうどそれをテストし、追加しました

- (void)playFrog;

私のインターフェースに。

次に、関数を実装しました

- (void)playFrog
{
[[NSSound soundName:@"Frog"] play];
}

次のように、アプリケーションの別の場所から呼び出しました

[self playFrog];

それはうまくいきました。

[編集2]

コードをもう一度読んだ後、SoundMaker を割り当て/初期化していないことに気付きました...

試す

SoundMaker *mySoundMaker = [[SoundMaker alloc] init];
[mySoundMaker makeSound];
[mySoundMaker release];
于 2011-04-07T22:11:44.513 に答える