objective-c - 如何解决 "Instance method [...] not found"错误?

标签 objective-c macos cocoa selector

我正在开发一个 Cocoa 应用程序。据我所知,当尝试调用选择器中的方法时,我所做的一切都是正确的。例如(摘要):

标题.h

@interface Foo

@property (nonatomic) BOOL variable;

- (void)bar;

@end

标题.m

#import "Header.h"

@implementation Foo

@synthesize variable;

- (void)bar
{
    NSLog("Test");
}

@end

OtherHeader.m

#import "Header.h"

@implementation OtherFoo

- (IBAction)otherBar:(id)sender
{
    Foo *foo = [sender representedObject];
    [foo bar]; // Generates warning
    BOOL variable = [foo variable]; // No warning
}

@end

当我这样做时,表达式[foo bar]收到警告“找不到实例方法“-bar”(返回类型默认为“id”)。

我意识到类似的问题已经被问了很多,但是我已经广泛地浏览了这些(以及 cocoa 和选择器的文档),但没有任何帮助。导致此错误的最常见原因似乎是遗漏了 bar 的实现或对 Header.h 的引用,但正如您所看到的,我两者都有。

编辑:选择器是从 NSMenuItem 的实例调用的 - 这就是我调用 representedObject 的原因。

编辑 2:由于某种原因,其他实例方法和属性不会生成警告。只是具体的实例方法。太奇怪了。

最佳答案

哇。我是个白痴。这个问题是因为我没有构建它造成的。由于 OtherHeader.h 位于单独的项目中,因此在编译该项目之前,XCode 自动完成功能无法在库文件中看到它。

因此,根据这个和我之前的互联网研究,我将总结我所知道的导致此错误的原因:

  1. 缺少包含实例方法的类的头文件
  2. 缺少实例方法的实现
  3. 自添加实例方法以来,尚未构建包含带有实例方法的 header 的项目。仅当您发送消息以从单独的项目调用实例方法时,才可能出现这种情况。

我希望这对那些像我一样花了几个小时困惑地盯着这个错误的人有所帮助。

关于objective-c - 如何解决 "Instance method [...] not found"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24581909/

相关文章:

macos - IntelliJ 无法从终端打开

java - 是否有用于 32 位 OS X 的 Java 1.7 JRE?

objective-c - NSTextfield 不接受具有 NSTitledWindowMask 的 NSWindow 上的键事件

objective-c - 在标准 NSWindow 上创建自定义标题栏

iphone - 将我的 iphone 应用程序添加为设备中的内容菜单

ios - 在 iOS 中检索所有联系人的电话号码

ruby - 如何在 Mac OS X 上手动构建通用 ruby​​? rvm 怎么样?

objective-c - 从服务器下载 cocoa 包

ios - 如何取消 [NSURLConnection sendAsynchronousRequest :. .] 发送的请求

objective-c - 使用分布式对象时出现 NSPort TimeoutException