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

时间:2012-01-27 15:35:09

标签: iphone objective-c ios interface-builder xcode-storyboard

更新

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

原始

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

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

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

  1. 我无法弄清楚如何获取更多信息
  2. 在另一个标签上,这很好用。两个选项卡都是自动生成的。
  3. (我可能在视图中弄乱了一些东西,但我没有弄清楚我做了什么)。

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

    更多信息

    在模拟器中我得到了

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

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

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

    Gesture recognizer in Interface builder crashes my app

    更多信息

    重现

    这是微不足道的
    1. 新的iPhone标签应用程序,ARC和Storyboard on
    2. 将点击手势拖动到第二个标签的视图(适用于第一个标签)
    3. 创建(IBAction)
    4. 将手势的选择器连接连接到#3
    5. 中的操作
    6. 运行,转到第二个标签
    7. 崩溃。与我的应用程序相同,默认选项卡有效,其他选项卡不可用

2 个答案:

答案 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

中将插座设置为nil

更新

不要将你的插座设置为零 - 部分错误是UIKit没有保留 - 你需要保留你的参考以确保识别器没有被释放。

答案 1 :(得分:2)

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