没有已知的实例方法选择器'myWindowController'

问题描述:

我在应用程序(它是在2011年编写的)中有以下代码。没有已知的实例方法选择器'myWindowController'

[[[[NSApp delegate] myWindowController] ...] ..]; 

由于升级到的Xcode 6.1这将产生以下的错误: - ARC Semantic Issue No known instance method for selector 'myWindowController'

通过以下更换此不产生错误。

id ttt = [NSApp delegate]; 
[[[ttt myWindowController] ...] ...]; 

PS Xcode中似乎认为类型是 '身份证< NSFileManagerDelegate>'

这到底是怎么回事?

我承认Cocoa和Xcode很生锈。我相信我可以通过适当的演员来解决它,但这似乎没有必要,我试图理解为什么。

更多信息

我AppDelegate.h

IBOutlet MyWindowController *myWindowController; 

而且AppDelegate.m

@synthesize myWindowController; 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    myWindowController = [[MyWindowController alloc] initWithWindowNibName:@"MainWindow"]; 

  1. 确保您导入包含MyWindowController @interface定义的标题。
  2. 使用(MyWindowController *)强制转换[NSApp委托]。

所以你的原线路:

[[[[NSApp delegate] myWindowController] ...] ..]; 

应该变成:

[[[(MyAppDelegate *)[NSApp delegate] myWindowController] ...] ..]; 

你也可以投用(ID),这是有效的,你与TTT变量做什么,但这是一个作弊。在转换时使用适当的类可以为您提供更好的编译器检查以及帮助Xcode提供准确的自动填充建议(这是在发生错误之前检测错误的好方法)。基本上,一个声明或转换为id的对象意味着它可以是任何类的一个对象,因此在任何类中定义的任何方法都将被视为有效。

我自己也遇到了与Xcode 6.1相同的问题。我认为编译器在Xcode 6.1中发生了某种变化。我希望自己有一个答案,为什么,我自己。它并没有给Xcode 6.1灌输很多信心。

我用演员表(MyAppDelegate *)解决了这个问题。

[[[(MyAppDelegate *)[NSApp delegate] myWindowController] currentTvc] saveTableColumns]; // Xcode 6.1 error 

我已得出结论,因为它似乎认为[NSApp delegate]返回类型为id<NSFileManagerDelegate>

这是一个Xcode 6.1错误