【问题标题】:Cocoa: Calling a method from AppDelegate.mCocoa:从 AppDelegate.m 调用方法
【发布时间】:2011-01-08 00:21:49
【问题描述】:

为了更好地理解我的应用程序中的启动、事件队列和方法,我正在尝试编写一个执行两件事的程序:在启动时播放哔声,每次用户点击按钮时播放。到目前为止,它仅在用户点击按钮时播放。我知道可能有多种方法可以播放启动哔声,但为了使用初始化代码,我想通过从 AppDelegate.m 文件的 applicationDidFinishLaunching 方法中调用我的哔声方法来完成。

这是我的代码:

日志.h

#import <Cocoa/Cocoa.h>


@interface Log : NSObject {

    IBOutlet id button;

}
-(void)beepAndLog;
-(IBAction)buttonPressed:(id)sender;

@end

日志.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'

确实,没有哔声,日志内容如下:

方法响应[11401:a0f] +[日志 beepAndLog]:无法识别的选择器 发送到类 0x100002100

(“MethodResponse”是我的项目名称,顺便说一句)

我不确定为什么 Log 不会响应 beepAndLog,因为这是它的方法之一。我叫错了吗?我有一种感觉,对于更有经验的人来说,这将是非常明显的。我是新手。任何帮助,将不胜感激!谢谢!

【问题讨论】:

    标签: objective-c cocoa methods initialization startup


    【解决方案1】:

    有两种可能。当您想要一个类方法时,您将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
    

    日志.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];
    }
    

    【讨论】:

    • 这是一个非常快速的响应。非常感谢,它工作得很好。我想我将不得不研究它们之间的差异。感谢您花时间帮助初学者!
    • 没问题。在类本身上调用类方法(+ 方法)。实例方法(- 方法)将用于从类实例化的对象。查看 Objective-C 文档了解更多详情。
    • Woooaaaahhhh....从头开始。我太兴奋了,它在启动时发出哔哔声和记录,我没有注意到按钮不再起作用。我现在在 [self beepAndLog] 旁边的 IBAction 方法中被警告“'Log may not respond to '-beepAndLog'”; GRRRR...现在呢?
    • 是否应该同时添加beepAndLog的类和实例方法,还是有更优雅的解决方案?
    • 你可以混合和匹配类和实例方法,是的。制作单例可能是您的最佳解决方案。然后,您的类将只有实例方法,但将单个实例返回给调用者的类方法除外。看我的第二个例子:logInstance 是一个类方法,返回唯一的 Log 实例,那么beepAndLog 将是一个实例方法。
    猜你喜欢
    • 1970-01-01
    • 2016-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多