40

以下代码给出了警告Sending 'ViewController *const __strong' to parameter of incompatible type 'id<AVAudioPlayerDelegate>'(它是以下代码中的第三行):

NSURL *sound0URL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"0" ofType:@"aiff"]];

audioPlayer0 = [[AVAudioPlayer alloc] initWithContentsOfURL:sound0URL error:nil];

[audioPlayer0 setDelegate: self];   // <---   this line causes the warning
[audioPlayer0 prepareToPlay];

audioPlayer0.currentTime = 0;
[audioPlayer0 play];

如何修复?我在ViewController的实例方法中有这段代码viewDidLoad。还有另一个类似的问题,但那是一个类方法:Incompatible pointer types assignmenting to 'id<AVAudioPlayerDelegate>' from 'Class'

4

5 回答 5

83

符合AVAudioPlayerDelegate头文件中的协议,警告就会消失。通过不声明一个类符合给定的协议,编译器不能保证(好吧,至少警告)你没有实现它所需的方法。下面的代码是一个更正的版本,它将抑制警告。

@interface ViewController : UIViewController <AVAudioPlayerDelegate>
@end
于 2012-04-30T02:04:33.790 回答
33

有趣的是,这对我没有用。我在头文件中定义了委托 -在UITableViewController中使用UIImagePickerControllerDelegate。由于 setDelegate 方法需要一个 id,所以我将委托设置如下:

[myImagePicker setDelegate: (id)self];

但我想知道这里发生了什么?因为这通常不会在其他代码区域的其他委托示例中显示出来。有人能解释一下吗?

谢谢

于 2013-09-17T16:14:35.843 回答
5

你自己(你的班级)没有

@interface MyClassName: NSObject <AVAudioPlayerDelegate>

在头文件中。

于 2012-04-30T02:06:01.527 回答
4

这是一个警告,告诉您错过在 .h 文件中定义您的委托

@interface ClassName : NSObject <YourDelegate>
于 2013-04-29T05:54:26.990 回答
0

确保在 UIComponent 大括号内添加委托

例如:@interface DemoView : UIView < UITableViewDelegate>

而不是委托您正在创建的属性。

@property(retain)id < UITableViewDelegate> demoDelegate

于 2015-01-29T12:12:28.090 回答