Objective c 如何让NSSound在用户定义的类中播放声音?

Objective c 如何让NSSound在用户定义的类中播放声音?,objective-c,nssound,Objective C,Nssound,这个问题来自Objective-C新手,所以请耐心听我说。我尝试在我的类中发出声音,并且成功地使用了NSBeep(),但没有使用NSSound。这里有一个例子。注意,NSBeep()和[[NSSound SOUND NAME:@“青蛙”]播放]在“main.m”程序中工作正常,但仅NSBeep()在SoundMaker类中工作。非常感谢您在学习如何让NSSound投入工作方面提供的任何帮助 main.m: #import <Foundation/Foundation.h> #impo

这个问题来自Objective-C新手,所以请耐心听我说。我尝试在我的类中发出声音,并且成功地使用了NSBeep(),但没有使用NSSound。这里有一个例子。注意,
NSBeep()和<代码>[[NSSound SOUND NAME:@“青蛙”]播放]在“main.m”程序中工作正常,但仅
NSBeep()在SoundMaker类中工作。非常感谢您在学习如何让NSSound投入工作方面提供的任何帮助

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;
}

在Xcode中,如果设置断点,它会被命中吗

我自己最近才开始,所以+(空虚)在我看来很奇怪;我正在用的那本书只教学生

- (return_variable)methodname
[编辑]

“我刚刚测试过,”他补充道

- (void)playFrog;
到我的界面

然后我实现了这个函数

- (void)playFrog
{
[[NSSound soundName:@"Frog"] play];
}
我在我的应用程序中从其他地方调用它,比如

[
selfplayfrog]

成功了

[编辑2]

再次阅读代码后,我注意到您没有分配/初始化SoundMaker

试一试


如前所述,解决方案是添加
睡眠(…)下面的语句
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

大多数其他答案,虽然还可以,但会让它看起来比需要的更复杂。您所需要的就是这一陈述(在Objective-C中),无论您希望在何处产生声音:

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

您可以在“系统首选项”的“声音”窗口中找到并测试各种声音名称。

好的,您准备好了吗?我已经够新手了,我还不知道如何使用断点。相反,我在SoundMaker的NSSound语句之后添加了一个NSLog语句,并开始听到一个声音。因此,我尝试了
睡眠(1)声明,瞧,我现在可以听到“青蛙”的声音了!因此,所需要的只是在NSSound语句之后加上
sleep(1)语句使其工作。感谢您的输入。如前所述,根据您的建议进行的测试最终找到了解决方案。顺便说一句,如果我理解正确的话,因为“makeSound”消息指的是类方法而不是实例方法(“+(void)”),所以我认为没有必要alloc/init.Ahh,好吧,那么+就像一个(C#)静态方法?很高兴知道:)
SoundMaker *mySoundMaker = [[SoundMaker alloc] init];
[mySoundMaker makeSound];
[mySoundMaker release];
#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
[[NSSound soundNamed:@"Hero"] play];