开发者社区 问答 正文

unrecognized selector sent to instance错误,如何处置?


集成IOS Push SDK后,如果控制台打印出以下log:

  1. [backcolor=transparent][[backcolor=transparent]NSConcreteMutableData[backcolor=transparent] gzipDeflate[backcolor=transparent]]:[backcolor=transparent] unrecognized selector sent to instance

请打开工程配置 - Build Settings - Other Linker Flags,添加-ObjC即可解决(注意大小写)。
(为什么需要添加-ObjC标志?该标志为ld链接器的参数,因为SDK中有使用OC的[backcolor=transparent]category特性对类进行扩展,-ObjC标志可以将工程的OC类和分类全部加载到可执行文件中;如果分类没有正确加载会导致部分调用错误,推送服务无法正常使用)

展开
收起
猫饭先生 2017-10-24 09:43:02 1458 分享 版权
阿里云 AI 助理回答

您提到的这个问题和解决方法是针对iOS应用开发中集成第三方SDK时可能遇到的一个常见错误。具体来说,当您在项目中集成阿里云的iOS Push SDK后遇到类似错误信息,这通常意味着编译器未能正确识别或链接到某些Objective-C类别(Category)。

为什么需要添加-ObjC标志?

Objective-C类别是一种扩展原有类功能的方式,不改变原有类的定义。但是,由于类别并非编译器必须加载的部分(不像直接在.m文件中实现的方法),因此在某些情况下,编译器默认可能不会加载所有的类别文件。这就会导致运行时找不到某些通过类别扩展的方法,从而抛出“unrecognized selector sent to instance”这样的错误。

-ObjC标志的作用:

  • 确保类别加载: 添加-ObjC标志到Other Linker Flags后,告诉链接器在构建可执行文件时包含所有Objective-C类别的实现。这样可以确保即使类别中的方法没有在代码中直接引用,它们也会被正确加载到内存中。
  • 支持Blocks和其他特性: 除了类别之外,这个标志还对支持Blocks、某些框架的使用(如CoreData的子类生成)等场景有帮助,因为它能确保动态库中所有Objective-C符号都被正确解析。

如何添加-ObjC标志:

  1. 打开Xcode项目。
  2. 选择您的项目目标(Project -> Target)。
  3. 点击“Build Settings”标签页。
  4. 在搜索框中输入“Other Linker Flags”找到该设置项。
  5. 在“Debug”和“Release”下,双击现有的值或点击"+"号添加新的值,输入-ObjC(注意大小写)。

完成以上步骤后,重新编译您的项目,上述因类别未加载导致的错误应该会得到解决,阿里云Push SDK能够正常工作了。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答分类:
问答地址: