为了更好地理解我的应用程序中的启动,事件队列和方法,我正在尝试编写一个执行两项操作的程序:在启动时和每次用户点击按钮时发出蜂鸣声。到目前为止它只在用户点击按钮时播放。我知道可能有多种方法可以让启动蜂鸣声播放,但是为了使用初始化代码,我想通过在AppDelegate.m文件的applicationDidFinishLaunching方法中调用我的beep方法来实现。
这是我的代码:
Log.h
#import <Cocoa/Cocoa.h>
@interface Log : NSObject {
IBOutlet id button;
}
-(void)beepAndLog;
-(IBAction)buttonPressed:(id)sender;
@end
Log.m
#import "Log.h"
@implementation Log
-(void)beepAndLog {
NSLog(@"The Method Was Called!");
NSBeep();
}
-(IBAction)buttonPressed:(id)sender {
[self beepAndLog];
}
@end
applicationDidFinishLaunching方法如下所示:
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
// Insert code here to initialize your application
[Log beepAndLog];
}
然而,在applicationDidFinishLaunching方法中,XCode警告我
'Log'可能无法响应'+ beepAndLog'
实际上,没有蜂鸣声,日志内容如下:
MethodResponse [11401:a0f] + [日志 beepAndLog]:无法识别的选择器 发送到类0x100002100
(“MethodResponse”是我项目的名称,顺便说一句)
我不确定为什么Log不会响应beepAndLog,因为这是它的一种方法。我打电话不正确吗?我有一种感觉,对于经验丰富的人来说,这将是非常明显的。我是新手。任何帮助,将不胜感激!谢谢!
答案 0 :(得分:3)
有两种可能性。您可以将beepAndLog
定义为实例方法,何时需要类方法,或者您希望在类上调用它时在实例上调用它。
要将其更改为类方法,请将标题更改为:
+(void)beepAndLog;
和实施:
+(void)beepAndLog {
NSLog(@"The Method Was Called!");
NSBeep();
}
对于其他解决方案,请确保您有一个类Log
的实例(可能是单例),并执行以下操作:
[[Log logInstance] beepAndLog];
来自您的通知方式。 Log
类需要看起来像这样:
Log.h:
#import <Cocoa/Cocoa.h>
@interface Log : NSObject {
IBOutlet id button;
}
+(Log *)logInstance;
-(void)beepAndLog;
-(IBAction)buttonPressed:(id)sender;
@end
Log.m:
#import "Log.h"
Log *theLog = nil;
@implementation Log
+(Log *)logInstance
{
if (!theLog) {
theLog = [[Log alloc] init];
// other setup (like hooking up that IBAction)
}
return theLog;
}
-(void)beepAndLog {
NSLog(@"The Method Was Called!");
NSBeep();
}
-(IBAction)buttonPressed:(id)sender {
[[Log logInstance] beepAndLog];
}