10

更新

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

原来的

我有一个通过制作新标签 iPhone 应用程序(使用 ARC)生成的故事板

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

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

  1. 我不知道如何获取更多信息
  2. 在不同的选项卡上,这工作正常。两个选项卡都是自动生成的。

(我可能在视图中搞砸了一些东西,但我不知道我做了什么)。

如果我以编程方式制作手势,它们可以正常工作,但是让它在情节提要中工作很好,而且我担心任何错误都会在某些时候以其他方式导致崩溃。

更多信息

在模拟器中我得到

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

同样,需要调试技术——例如,有没有办法找出对象 0x6d2db70 是什么?

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

Interface builder中的手势识别器使我的应用程序崩溃

更多信息

这很容易重现

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

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

4

2 回答 2

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 中的一个错误。 提交错误报告。SecondViewController您可以通过创建一个强大的插座并将其连接到手势识别 器来解决该错误。确保将出口设置为 nil in viewDidUnload

更新

永远不要将你的出口设置为零——部分错误是 UIKit 没有保留——你需要保留你的引用以确保识别器没有被释放。

于 2012-01-28T19:04:13.407 回答
2

在我的例子中,当通过拖放代码为手势识别器自动创建 IBOutlet 时,Xcode 正确地创建了具有“强”属性的属性,但它还在 viewDidUnload 中添加了“设置为 nil”。删除“设置为零”为我解决了这个问题。

于 2012-06-21T12:02:45.810 回答