unrecognized selector sent to class 问题解决

27 篇文章 0 订阅
10 篇文章 0 订阅

unrecognized selector sent to class 问题解决

unrecognized selector sent to class 

Xcode9作为最新的iOS的开发工具,相信很多小伙伴们都已经安装了,
大家对于各种兼容和bug修改头都大了吧.

本来,我还真的没有遇到过Xcode找不到文件或者方法的问题.

之前有写过一个demo并上传到gitHub上面, 有朋友下载下来想要使用,
于是他将几个.h和.m等文件合并在一个文件夹内,直接放到项目中,
然后运行就崩溃了

于是就issues告诉到我,我开始以为是他没有在使用的地方引用项目文件,
他却说已经引用了,并且方法名 方法都能调用,
编译都没有问题,但是一运行就报错了

我也蒙了,于是索要了一个问题demo, 拿过来一看,跟我之前的项目没有任何代码区别,仅仅是他将部分代码文件合并放在一个文件夹中.

于是编译运行,崩溃了,

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '+[UIBarButtonItem itemWithTarget:action:image:]: unrecognized selector sent to class 0x104e51c20'

出现了这样的日志,
很明显的原因就是一个没有找到该类的方法或者文件,

于是基于以前开发的经验,

  • 解决方法1:

前往targets的building setting 的Other Linker flags
添加以下两项
-all_load
-ObjC

如果还是不行的话,就把你需要添加的文件直接拖到该项中,手动关联即可
你之前的问题,就是因为这个引起的,只要在Other Linker flag 添加需要相应的文件路径即可
类似这样
这里写图片描述

再次编译运行,果然,项目顺利运行了,
于是将解决方案告知朋友,

然后令我崩溃的事情出现了

朋友说手抖删掉了某一个添加的索引,然后自己就不会添加了..

心中很是无语,告诉了方法之后,我又开始思考.这样的问题如果这么容易出现,每个文件都需要手动添加索引的话,不就太麻烦了吗?
other link flags 很多人都知道,项目中添加某些静态库可能会需要设置这个,但是一般是不需要的,不可能一个文件夹就能影响这么大的

  • 解决方法2:

于是想到是否是因为文件没有包含到对应的target中?
这里写图片描述
添加文件的时候明明已经add to targets了,
但是进去项目中,查看.m文件.果然,朋友的文件中不能运行代码的文件就是缺少了这个,对比项目中的其他文件,仅仅是缺少这个勾选
于是勾选target membership,果然编译运行都好了
这里写图片描述

不需要一个一个文件手动添加索引了,只需要勾选一下即可
看来这个才是最好的解决方法.

这个应该是Xcode9的一个bug. 最起码我之前没有遇到过…..

于是在此记录一下这个问题,第一时间告诉到朋友,并分享给大家,方便大家遇到类似的问题能够找到解决方案

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在iOS开发中,当我们运行程序时,有时候会遇到"appDelegate window: unrecognized selector sent to instance"的错误。这个错误发生的原因是我们使用了一个未定义的方法。 通常,这个错误是由于我们在我们的代码中使用了一个不存在的方法。具体来说,"appDelegate"是我们的应用程序的代理类,"window"是一个窗口对象。这个错误的意思是我们在"appDelegate"实例上调用了一个名为"window"的方法,但是这个方法并不存在。 为了解决这个问题,我们需要检查我们的代码,找到在"appDelegate"实例上调用"window"方法的地方。一旦我们找到了这个地方,我们可以考虑以下几种解决方案: 1.确保我们正确地实例化了"window"对象。我们需要检查我们的代码,看看我们是否正确地创建了"window"对象并将其设置为"appDelegate"的属性。 2.检查我们的代码,确保我们没有在"appDelegate"类中手动添加了一个名为"window"的方法。有时候我们可能会错误地将一个成员变量声明为一个方法,导致这个错误的发生。 3.如果我们通过Storyboard或XIB文件创建了窗口对象,我们需要确保我们正确地将窗口对象与"appDelegate"关联起来。可以通过检查我们的Storyboard或XIB文件中的连接和引用关系来解决这个问题。 总结一下,当我们遇到"appDelegate window: unrecognized selector sent to instance"错误时,需要检查我们的代码,确保我们正确地实例化了窗口对象,并且没有使用一个未定义的方法。 ### 回答2: 这个错误通常是由于在代码中调用了`[appDelegate window]`方法,但是`appDelegate`对象并不存在该方法所导致的。该方法的作用是返回`AppDelegate`对象的窗口属性。 产生此错误的原因可能有: 1. 在调用`[appDelegate window]`方法之前,没有正确初始化和分配内存给`appDelegate`对象。 2. `appDelegate`类中没有定义`window`属性或对应的`getter`方法。 解决问题的方法是: 1. 确保在使用`[appDelegate window]`方法之前正确初始化和分配内存给`appDelegate`对象,可以使用`alloc init`等方法。 2. 确保`appDelegate`类中定义了`window`属性并有对应的`getter`方法。 以下是一个示例代码,演示了正确初始化`appDelegate`对象并调用`window`属性: ```objective-c // 创建并初始化AppDelegate对象 AppDelegate *appDelegate = [[AppDelegate alloc] init]; // 使用appDelegate对象的window属性 UIWindow *window = [appDelegate window]; ``` 希望以上回答能够解决你的问题。如果有任何进一步的问题,请随时提问。 ### 回答3: 这个错误通常是因为在使用iOS开发中的AppDelegate时调用了window方法,但是实际上AppDelegate类并没有该方法,导致了这个错误。 解决这个问题有几种方法: 1. 检查调用window方法的地方是否正确。确保你正在调用的对象确实是AppDelegate的实例,并且确保没有拼写错误。 2. 检查你的AppDelegate类是否正确实现了UIApplicationDelegate协议。确认你的AppDelegate类中有正确的UIApplicationDelegate方法实现,包括window属性的设置。 3. 检查你的Storyboard或XIB文件是否正确设置了AppDelegate的窗口。确认你的Storyboard或XIB文件中已经正确设置了AppDelegate的窗口,以便在应用程序启动时正确地加载窗口。 如果你仔细检查并尝试了以上方法,仍然无法解决这个错误,那么可能是由于其他原因引起的。这种情况下,你可以尝试删除并重新创建AppDelegate类,或者重新创建项目。如果问题仍然存在,那么可能是其他代码或框架中的错误导致的,需要进一步调试定位。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值