Cocoa:从AppDelegate.m调用方法

时间:2010-01-22 00:23:14

标签: objective-c cocoa methods initialization startup

为了更好地理解我的应用程序中的启动,事件队列和方法,我正在尝试编写一个执行两项操作的程序:在启动时和每次用户点击按钮时发出蜂鸣声。到目前为止它只在用户点击按钮时播放。我知道可能有多种方法可以让启动蜂鸣声播放,但是为了使用初始化代码,我想通过在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,因为这是它的一种方法。我打电话不正确吗?我有一种感觉,对于经验丰富的人来说,这将是非常明显的。我是新手。任何帮助,将不胜感激!谢谢!

1 个答案:

答案 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];
}