更新
对于旧版本的Xcode来说,这是一个老问题。事实证明,问题是Xcode中的一个错误已被修复。
原始
我有一个故事板是通过制作新的标签iphone应用程序(使用ARC)生成的
在我的一个标签中,如果我将一个手势识别器(任何,但让我们说Pan)拖到一个控件上,然后将选择器设置为一个动作,它就会在我转到标签时立即崩溃。
控制台中没有任何内容 - 在加载故事板时似乎正在发生(从未调用viewDidLoad)。
(我可能在视图中弄乱了一些东西,但我没有弄清楚我做了什么)。
如果我以编程方式制作手势,它们可以很好地工作,但是让它在故事板中工作很好,而且我担心任何错误都会在某些时候以其他方式导致崩溃。
更多信息
在模拟器中我得到了
-[__NSCFString setView:]: unrecognized selector sent to instance 0x6d2db70
再次,需要调试技术 - 例如,有没有办法找出0x6d2db70是什么对象?
这与这个问题完全一样(没有答案):
Gesture recognizer in Interface builder crashes my app
更多信息
重现
这是微不足道的崩溃。与我的应用程序相同,默认选项卡有效,其他选项卡不可用
答案 0 :(得分:9)
错误消息告诉我们程序正在将setView:
消息发送到__NSCFString
的实例(显然是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中的一个错误。 File a bug report.您可以通过在SecondViewController
上创建强大的插座并将其连接到手势识别器来解决此问题。 确保在 viewDidUnload
。
不要将你的插座设置为零 - 部分错误是UIKit没有保留 - 你需要保留你的参考以确保识别器没有被释放。
答案 1 :(得分:2)
在我的例子中,当通过拖放代码自动创建手势识别器的IBOutlet时,Xcode正确地创建了具有“强”属性的属性,但它还添加了“set to nil”in viewDidUnload。删除“设置为零”解决了我的问题。