没有已知的实例方法选择器'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"];
答
- 确保您导入包含MyWindowController @interface定义的标题。
- 使用(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>