在StoryBoard中使用手势识别器时崩溃

UPDATE

对于旧版本的Xcode来说,这是一个老问题。 事实certificate,问题是Xcode中的一个错误已被修复。

原版的

我有一个故事板来自制作一个新的标签iphone应用程序(与ARC)

在我的一个标签中,如果我将一个手势识别器(任何,但让我们说Pan)拖到控件上,然后将选择器设置为一个动作,它就会在我转到选项卡时崩溃。

控制台中没有任何内容 – 在加载故事板时似乎正在发生(从未调用viewDidLoad)。

  1. 我无法弄清楚如何获得更多信息
  2. 在另一个选项卡上,这很好。 两个选项卡都是自动生成的

(我可能在视图中弄乱了一些东西,但我没有弄清楚我做了什么)。

如果我以编程方式制作手势,它们可以正常工作,但是让它在故事板中工作很好,而且我担心任何错误都会在某些方面导致崩溃。

更多信息

在我得到的模拟器中

-[__NSCFString setView:]: unrecognized selector sent to instance 0x6d2db70 

再次,需要调试技术 – 例如,有没有办法找出0x6d2db70是什么对象?

这与这个问题完全一样(没有答案):

“界面”构建器中的手势识别器会崩溃我的应用程序

更多信息

重现这一点很简单

  1. 新的iPhone标签应用程序,ARC和Storyboard on
  2. 将点按手势拖动到第二个标签的视图上(适用于第一个标签)
  3. 创建(IBAction)
  4. 将手势的选择器连接连接到#3的操作
  5. 运行,转到第二个选项卡

崩溃。 与我的应用程序相同,默认选项卡有效,其他选项卡则无效

错误消息告诉我们程序正在将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”。 删除“设置为零”解决了我的问题。

Interesting Posts