击败"多个名为'xxx:'found"的方法错误

Hol*_*orf 30 xcode warnings objective-c

在我的ViewController.m文件中的当前项目中,我正在运行该方法:

[[connection writer] writeData: data];
Run Code Online (Sandbox Code Playgroud)

它返回警告:

warning: multiple methods named 'writeData:' found
Run Code Online (Sandbox Code Playgroud)

我试图调用该方法:

- (void) writeData: (NSData*)data
Run Code Online (Sandbox Code Playgroud)

...在TCPWriter.m中.不幸的是,还有另外两种writeData方法

- (void)writeData:(NSData *)data;
Run Code Online (Sandbox Code Playgroud)

...在NSFileHandle.h和......

- (BOOL)writeData:(NSData *)data
Run Code Online (Sandbox Code Playgroud)

......在NSURLHandle.h.这对我来说尤其令人困惑,因为[conn writer]应该返回TCPWriter类,该类应该调用正确的writeData方法.此外,我甚至不完全确定NSFileHandle.h和NSURLHandle.h甚至包含在ViewController.h中包含的任何库中,而不是包含在项目的不同部分中.

如何向编译器显示writeData我想要调用的方法以及为什么会发生此错误?

Pet*_*wis 54

确保[连接编写器]实际返回TCPWriter*.如果它返回一个id,那么编译器将不知道要使用哪个writeData.此外,请确保您正在导入TCPWriter.h文件 - 如果编译器没有看到头文件,它将默认返回id,这将使您回到同样的问题.

尝试

TCPWriter* writer = [connection writer];
[writer writeData: data];
Run Code Online (Sandbox Code Playgroud)

要么

[(TCPWriter*)[connection writer] writeData: data];
Run Code Online (Sandbox Code Playgroud)

  • 打开警告,你不必怀疑.其他链接器标志:-Wall,并打开其他许多标志,包括将警告视为错误. (2认同)

McU*_*Usr 6

作为上述出色回答的替代方案,您可以将对象转换为正确的类型以摆脱警告,例如:

[(NSView*)textView setAutoresizingMask:(NSViewWidthSizable | NSViewHeightSizable)]; // for horizontal scrolling
Run Code Online (Sandbox Code Playgroud)