更新
对于旧版本的Xcode来说,这是一个老问题。事实证明,这个问题是Xcode中的一个错误,已经修复。
原始
我有一个故事板生成了一个新的标签iphone应用程序(与ARC)
在我的一个选项卡中,如果我将手势识别器(任何,但假设为平移)拖到控件上,然后将选择器设置为一个动作,那么我一转到该选项卡,它就会崩溃。
控制台中没有任何内容——它似乎是在加载情节提要时发生的(从未调用viewDidLoad)。
- 我不知道如何获得更多信息
- 在另一个选项卡上,这很好。这两个选项卡都是自动生成的
(有可能我在视图中搞砸了什么,但我不知道自己做了什么)。
如果我以编程方式做出手势,它们会很好地工作,但能在故事板中工作是很好的,我担心无论出了什么问题,都会在某个时候以其他方式导致崩溃。
更多信息
在模拟器中我得到
-[__NSCFString setView:]: unrecognized selector sent to instance 0x6d2db70
同样,需要调试技术——例如,有没有办法找出对象0x6d2db70是什么?
这正是这个问题(没有答案):
界面生成器中的手势识别器使我的应用崩溃
更多信息
这对于再现来说是微不足道的
- 新的iPhone选项卡式应用程序,ARC和Storyboard
- 将点击手势拖动到第二个选项卡的视图上(适用于第一个选项卡)
- 创建(IBAction)
- 将手势的选择器连接连接到#3中的动作
- run,转到第二个选项卡
崩溃。与我的应用程序相同,默认选项卡有效,其他选项卡不
错误消息告诉我们程序正在向__NSCFString
的实例发送setView:
消息(这显然是NSString
的私有实现类)。
请确保您已尝试在启用僵尸的情况下运行。僵尸很容易导致无法识别的选择器错误。
如果它不是僵尸,请在-[NSObject doesNotRecognizeSelector:]
上设置一个断点。当遇到断点时,您可能只需要从堆栈跟踪中就可以找出问题。如果没有,则可以打印对象的debugDescription
(与大多数类的description
相同)。
在模拟器上,您可以要求调试器打印对象的debugDescription
,如下所示:
(gdb) frame 0
#0 0x013bcbff in -[NSObject doesNotRecognizeSelector:] ()
(gdb) po ((int*)$ebp)[2]
this is my test string
在设备上,你可以这样做:
(gdb) frame 0
#0 0x344bca22 in -[NSObject doesNotRecognizeSelector:] ()
(gdb) po $r0
this is my test string
更新
根据您的复制步骤,这是UIKit中的一个错误。提交错误报告。您可以通过在SecondViewController
上创建一个强大的出口并将其连接到手势识别器来解决这个错误 确保在viewDidUnload
中将出口设置为零
更新
永远不要将你的出口设置为零——错误的一部分是UIKit没有保留——你需要保留你的引用,以确保识别器不会被释放。
在我的例子中,当通过在代码中拖动为手势识别器自动创建IBOutlet时,Xcode正确地创建了具有"strong"属性的属性,但它也在viewDidUnload中添加了"set to nil"。删除"设置为零"为我解决了这个问题。