从“Class”分配给“id”的指针类型不兼容

2024-02-22

我有一个 ”Utility“ 实现的类AVAudioPlayerDelegate协议。

这是我的实用程序.h

@interface Utility : NSObject <AVAudioPlayerDelegate>
{
}

这是它的对应物实用程序.m

@implementation Utility

static AVAudioPlayer *audioPlayer;

+ (void)playAudioFromFileName:(NSString *)name ofType:(NSString *)type withPlayerFinishCallback:(SEL)callback onObject:(id)callbackObject
{
    ... 
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: [self getResourceURLForName:name ofType:type] error: nil];
    audioPlayer.delegate = self; // this is the line that causes the Warning
    ...
}

我的 iOS 应用程序运行良好,但是在迁移到 iOS 5 和 Xcode 4.2 后,编译器开始抛出此警告,位于audioPlayer.delegate = self; line:

Incompatible pointer types assigning to id <AVAudioPlayerDelegate> from 'Class'

我怎样才能摆脱它?


您已将方法声明为类方法,并且尝试使用 Class 对象作为委托。但是您不能将协议添加到 Class 对象。

你需要改变playAudioFromFileName:...到一个实例方法并创建一个实例Utility用作代表。也许您想要一个实例Utility由所有呼叫者共享。这就是 Singleton 模式,在 Cocoa 中很常见。你做这样的事情:

实用程序.h

@interface Utility : NSObject <AVAudioPlayerDelegate>
+ (Utility *)sharedUtility;
@end

实用程序.m

@implementation Utility

+ (Utility *)sharedUtility
{
    static Utility *theUtility;
    @synchronized(self) {
        if (!theUtility)
            theUtility = [[self alloc] init];
    }
    return theUtility;
}

- (void)playAudioFromFileName:(NSString *)name ofType:(NSString *)type withPlayerFinishCallback:(SEL)callback onObject:(id)callbackObject
{
    ... 
    audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL: [self getResourceURLForName:name ofType:type] error: nil];
    audioPlayer.delegate = self;
    ...
}

@end

Usage

[[Utility sharedUtility] playAudioFromFileName:@"quack" ofType:"mp3" withPlayerFinishCallback:@selector(doneQuacking:) onObject:duck];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从“Class”分配给“id”的指针类型不兼容 的相关文章

  • iOS 5 不允许将下载的数据存储在 Documents 目录中?

    我为我的客户制作了一个应用程序 将目标 iOS 保留为 4 但由于应用程序仍未提交到Apple store 我的客户正计划将其升级到iOS 5 0 为此我阅读了苹果的指导方针 https developer apple com icloud
  • 为什么我应该始终启用编译器警告?

    我经常听说在编译 C 和 C 程序时我应该 始终启用编译器警告 为什么这是必要的 我怎么做 有时我也听说我应该 将警告视为错误 我是不是该 我怎么做 为什么我应该启用警告 众所周知 C 和 C 编译器不善于报告一些常见的程序员错误默认情况下
  • 固定卡满足 FITS 标准是什么意思?

    我正在尝试使用 FITS 文件 我有以下代码 from astropy io import fits from astropy wcs import WCS hdul fits open fitsfilename 0 wcs WCS hdu
  • 更改搜索栏中的键盘颜色和外观

    当用户点击搜索文本字段时 我想将键盘的颜色更改为黑色 我试图通过以下方式实现它UITextField textField UITextField appearance textField setKeyboardAppearance UIKe
  • 禁用所选文件的“文档注释”警告

    Xcode 能够检查文档注释问题 并在出现问题时报告警告 例如 我使用 CocoaPods 将 Facebook SDK 添加到我的项目中 在文件中的某个时刻FBError h有以下代码 typedef NS ENUM NSInteger
  • 从 ARC 静态库访问 @property 时,ARC 应用程序崩溃

    我有一个 ARC 自动引用计数 questions tagged automatic reference counting 构建静态库 也称为 ARC 的应用程序 该应用程序将正常启动 但当执行读取或写入静态库中的 property 的操作
  • AirPlay 的音频输出路由

    我已经查看过 但找不到访问音频输出路由的方法 因此我可以检测音频是否通过 AirPlay 输出 这是我在 iOS 5 0 文档中找到的 kAudioSessionOutputRoute AirPlay 讨论 这些字符串用作与 kAudioS
  • Eclipse - @SuppressWarnings("javadoc") 不起作用

    我将 Eclipse 配置为显示有关公共元素缺少 javadoc 注释和标签的警告 这对我来说非常有用 可以很好地记录我的代码 但有时我有一堂课 其中有几个常量描述例如 DFA 的状态或其他东西 不需要记录这些常量 因为它们是不言自明的 所
  • 如何从 TFS MS Build 或 TFS API 获取构建警告

    我正在尝试从 MS Build 获取构建警告 在包含或具有多个解决方案的构建中 是否可以使用 TFS API 或使用 QUERY 的任何 TFS DB 进行获取 你可以使用这个TFS用于获取日志的 REST API https www vi
  • ios5 - 带有故事板的模态视图控制器的大小

    有没有什么方法可以调整使用故事板segue以模态方式呈现的视图控制器的大小 如何通过翻转过渡从该模态视图控制器中呈现另一个视图控制器 如果我将其定义为 Style Modal Presentation Default Transition
  • 获取警告的回溯

    在 numpy 中我们可以做np seterr invalid raise http docs scipy org doc numpy reference generated numpy seterr html获取引发错误的警告的回溯 请参
  • 如何切换 UITableView Cell 的选定状态

    我有一个带有自定义单元格的 UITableView 该单元格包含一个 UIImageView 和一个 UILabel 现在 当我第一次加载表格时 它会在每个单元格上加载相同的图像和不同的标签 这些标签是从 LabelArray 中获取的 现
  • NSMutableAttributedString 的自动换行

    我有 NSMutableAttributedString 并且字符串很长 我想在 UIlabel 上显示它时进行自动换行 如果是 NSString 我会继续做这样的事情 动态 UILabel 截断文本 https stackoverflow
  • Jquery - 限制文本输入中的文本,而不是文本区域

    使用 jquery 如何限制可以在文本字段中输入的字符数 不是指文本区域 只是一个普通的文本输入字段 我有一个表单 并通过 iPad 使用 IOS5 进行查看 由于某种原因 maxlength 属性被忽略 如果我使用 maxlength 1
  • 这是一个不正确的警告吗?

    让我们看看我经常看到的这个代码模式 struct Foo template
  • iOS:iOS 4.3 和 5.0 之间不同的 addSubview 行为

    之前在 iOS 4 3 中编码时 我发现将视图控制器的视图添加到另一个视图时 superview addSubView controller view 控制器实例将不会收到 viewWillAppear viewDidAppear消息 比我
  • 基于对 UIAlertView 的响应从 UITableViewCell 进行条件 Segue 导航

    我的问题似乎是一个普遍问题 但似乎找不到答案 我遇到一种情况 当用户点击自定义 UITableViewCell 时 我想显示一个警报 然后根据对警报的响应 要么停留在同一视图上 用户选择取消 要么显示另一个视图 如果用户选择继续 我想使用故
  • iPhone中的异步for循环

    for循环看起来像这样 我在视图中编写的确实加载了 因此加载此页面需要更多时间 for int i 3 i lt dataDict objectForKey rss objectForKey channel objectForKey ite
  • 警告:格式“%d”需要类型“int *”,但参数 2 的类型为“int”

    所以我是 C 的新手 并且对这个警告发生的情况遇到了麻烦 该警告是什么意思以及我该如何解决它 我写的代码在这里 void main void char name int age 0 printf input your name n scan
  • 禁用 VIM 中的警告?

    有没有办法禁用 VIM 中的警告 特别是 当文件从只读变为可写时 我想禁用警告 12 我有一个脚本可以打开文件进行编辑 但 vim 认为文件已更改并发出警告 Thanks 我的 vimrc 中有以下内容 你应该只需要第二个 它将消息回显到状

随机推荐