0

这个问题来自一个Objective-C新手,所以请多多包涵。我正在尝试在我的课程中发出声音,并且使用 NSBeep() 但不是 NSSound 成功。这是一个例子。请注意,NSBeep();[[NSSound soundNamed:@"Frog"] play];“main.m”程序中工作正常,但仅NSBeep();在 SoundMaker 类中工作。非常感谢学习如何让 NSSound 工作的任何帮助。

主.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 回答
0

大多数其他答案虽然还可以,但使它看起来比需要的更复杂。你所需要的只是这个语句(在 Objective-C 中),无论你想在哪里产生声音:

[[NSSound soundNamed:@"Hero"] play];

您可以在“系统偏好设置”的“声音”窗口中找到并测试各种声音名称。

于 2018-03-06T02:32:15.400 回答