我在这种方法中发现了警告.找到了多个名为'state'的方法?

Ami*_*jar 2 macos objective-c

我是mac开发的新手.这是我的代码,但我不明白这个警告.请帮我.

  - (IBAction)toggleFiles:(id)sender
  {
NSRect frame = [oWindow frame];
NSRect contentRect = [oWindow contentRectForFrameRect:frame];
float titlebarHeight = NSHeight(frame) - NSHeight(contentRect);

NSSize newSize = [sender state] == NSOnState ? sFilesExpandedSize : sFilesCollapsedSize;
frame.origin.y -= newSize.height - contentRect.size.height;
frame.size = newSize;
frame.size.height += titlebarHeight;

[oWindow setFrame:frame display:YES animate:YES];

[[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithBool:(int)  [sender state] == NSOnState]
                                           forKey:@"DisplayFiles"];
 }
Run Code Online (Sandbox Code Playgroud)

此警告发现 - 找到了名为"state"的多个方法.如何解决这个问题.请帮我.

bbu*_*bum 6

sender输入为id.这意味着编译器会将编译器知道的任何地方定义的所有方法都视为sender可以响应的可能事物集.

不幸的是,声明有两种state方法(或更多)具有不同的论证.有人可能会返回一个BOOL和一个可能返回NSUInteger,例如.

因此,编译器警告您调用state一般类型的(id)对象可能会产生意外的结果,因为无法知道返回值的类型可能是什么.

解?

要么静态地键入sender某个特定的类(即 - (IBAction)toggleFiles :( SomeClass*)sender;或者对返回值进行类型转换.

在任何一种情况下,添加类似于assert([sender isKindOfClass:[ExpectedClass class]);该动作方法的东西都是防御性的.