在StoryBoard中使用手势识别器时崩溃
UPDATE
对于旧版本的Xcode来说,这是一个老问题。 事实certificate,问题是Xcode中的一个错误已被修复。
原版的
我有一个故事板来自制作一个新的标签iphone应用程序(与ARC)
在我的一个标签中,如果我将一个手势识别器(任何,但让我们说Pan)拖到控件上,然后将选择器设置为一个动作,它就会在我转到选项卡时崩溃。
控制台中没有任何内容 – 在加载故事板时似乎正在发生(从未调用viewDidLoad)。
- 我无法弄清楚如何获得更多信息
- 在另一个选项卡上,这很好。 两个选项卡都是自动生成的
(我可能在视图中弄乱了一些东西,但我没有弄清楚我做了什么)。
如果我以编程方式制作手势,它们可以正常工作,但是让它在故事板中工作很好,而且我担心任何错误都会在某些方面导致崩溃。
更多信息
在我得到的模拟器中
-[__NSCFString setView:]: unrecognized selector sent to instance 0x6d2db70
再次,需要调试技术 – 例如,有没有办法找出0x6d2db70是什么对象?
这与这个问题完全一样(没有答案):
“界面”构建器中的手势识别器会崩溃我的应用程序
更多信息
重现这一点很简单
- 新的iPhone标签应用程序,ARC和Storyboard on
- 将点按手势拖动到第二个标签的视图上(适用于第一个标签)
- 创建(IBAction)
- 将手势的选择器连接连接到#3的操作
- 运行,转到第二个选项卡
崩溃。 与我的应用程序相同,默认选项卡有效,其他选项卡则无效
错误消息告诉我们程序正在将setView:
消息发送到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
上创建一个强大的sockets并将其连接到手势识别器来解决该问题。 确保在 viewDidUnload
中将sockets设置为nil。
更新
不要将你的sockets设置为零 – 部分错误是UIKit没有保留 – 你需要保留你的参考以确保不释放识别器。
在我的例子中,当通过拖放代码自动创建手势识别器的IBOutlet时,Xcode正确地创建了具有“强”属性的属性,但它还在viewDidUnload中添加了“set to nil”。 删除“设置为零”解决了我的问题。