我在应用程序中有以下代码(2011年编写)。
[[[[NSApp delegate] myWindowController] ...] ..];
自升级到Xcode 6.1以来会产生以下错误: -
ARC Semantic Issue No known instance method for selector 'myWindowController'
通过以下内容替换它不会产生错误。
id ttt = [NSApp delegate];
[[[ttt myWindowController] ...] ...];
PS Xcode似乎认为类型是' id< NSFileManagerDelegate>'
这里发生了什么?
我承认Cocoa和Xcode非常生疏。我相信我可以通过适当的演员来解决它,但这似乎没必要,我试图理解为什么。
更多信息
我的AppDelegate.h
IBOutlet MyWindowController *myWindowController;
和AppDelegate.m
@synthesize myWindowController;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
myWindowController = [[MyWindowController alloc] initWithWindowNibName:@"MainWindow"];
答案 0 :(得分:1)
我通过演员(MyAppDelegate *)
解决了这个问题。
[[[(MyAppDelegate *)[NSApp delegate] myWindowController] currentTvc] saveTableColumns]; // Xcode 6.1 error
我已经断定这是一个Xcode 6.1错误,因为它似乎认为[NSApp delegate]
返回类型id<NSFileManagerDelegate>
答案 1 :(得分:0)
所以你原来的一行:
[[[[NSApp delegate] myWindowController] ...] ..];
应该成为:
[[[(MyAppDelegate *)[NSApp delegate] myWindowController] ...] ..];
你也可以使用(id)进行转换,这实际上就是你用ttt变量做的事情,但那是作弊的。在转换时使用适当的类将为您提供更好的编译器检查,并帮助Xcode提供准确的自动完成建议(这是在错误发生之前检测错误的好方法)。基本上声明或转换为id的对象意味着它可以是任何类的对象,因此任何类中定义的任何方法都将被视为有效。
我自己也遇到了与Xcode 6.1相同的问题。我认为编译器在Xcode 6.1中以某种方式发生了变化。我希望自己有一个答案。它并没有在Xcode 6.1中灌输很多信心。