如何解决警告:将'ViewController * const __strong'发送到不兼容类型'id <avaudioplayerdelegate>的参数?</avaudioplayerdelegate>

时间:2012-04-30 01:57:22

标签: iphone ios avfoundation

以下代码警告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的{​​{1}}实例方法中使用了此代码。还有一个类似的问题,但这是一个类方法:Incompatible pointer types assigning to 'id<AVAudioPlayerDelegate>' from 'Class'

5 个答案:

答案 0 :(得分:77)

符合头文件中的AVAudioPlayerDelegate协议,警告将消失。通过不声明类符合给定的协议,编译器无法保证(至少警告)您未能实现它所需的方法。以下代码是一个将禁止警告的更正版本。

@interface ViewController : UIViewController <AVAudioPlayerDelegate>
@end

答案 1 :(得分:31)

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

[myImagePicker setDelegate: (id)self];

但我想知道这里发生了什么?因为这通常不会出现在其他代码区域的其他委托示例中。有谁可以澄清这个?

谢谢

答案 2 :(得分:4)

你的自己(你的班级)没有

@interface MyClassName: NSObject <AVAudioPlayerDelegate>

在头文件中。

答案 3 :(得分:2)

这是一个警告,告诉您错过了在.h文件中定义代理

@interface ClassName : NSObject <YourDelegate>

答案 4 :(得分:0)

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

例如: @interface DemoView:UIView&lt;的UITableViewDelegate&GT;

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

@property(retain)id&lt;的UITableViewDelegate&GT; demoDelegate