【问题标题】:iOS app using Swift crashing only giving (lldb) as output使用 Swift 崩溃的 iOS 应用程序仅提供 (lldb) 作为输出
【发布时间】:2014-07-24 12:25:47
【问题描述】:

首先,对不起,如果我在这里放太多了:我已经把我认为可能有用的所有东西都放在了帖子中。

我正在编写一个应用程序,它试图在表格视图单元格中呈现水平集合视图。当没有显示集合视图单元格时,即我已为该函数中的单元格数返回 0,一切正常。

但是当我尝试显示一个单元格时,代码崩溃,除了输出中的(lldb)EXC_BREAKPOINT(code=EXC_I386_BPT, subcode=0x0)(在0x2d5372: movl %esi, %eax 上方以绿色突出显示)之外没有错误消息。

点击让应用程序继续然后再次崩溃,每个需要显示的单元格出现相同的症状,即每次调用 ...cellForItemAtIndexPath... 函数时。

我的单元格代码是:

class homeWhatsOnCellectionCell: UICollectionViewCell {
    @IBOutlet var filmTitle: UILabel!
    @IBOutlet var filmPoster: UIImageView!
}

对于集合视图是:

class homeTableViewController: UITableViewController, UICollectionViewDelegate, UICollectionViewDataSource {
    @IBOutlet var onThisWeekCollectionView: UICollectionView!
    ...
    override func viewDidLoad() {
        onThisWeekCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Home Whats On Collection View Cell")
    }

    func collectionView(collectionView: UICollectionView!, numberOfItemsInSection section: Int) -> Int {
        return 1
    }

    func collectionView(collectionView: UICollectionView!, cellForItemAtIndexPath indexPath: NSIndexPath!) -> UICollectionViewCell! {
        var cell: homeWhatsOnCellectionCell = collectionView.dequeueReusableCellWithReuseIdentifier("Home Whats On Collection View Cell", forIndexPath: indexPath) as homeWhatsOnCellectionCell
        cell.filmTitle.text = "The Hunger Games: Catching Fire"
        cell.filmPoster.image = UIImage(named: "The Hunger Games.jpg")
        return cell
}

    func numberOfSectionsInCollectionView(collectionView: UICollectionView!) -> Int {
        return 1
}

最后,在最后一个无法解释的崩溃上单击继续,再次崩溃并显示我无法弄清楚的错误消息。如果你也能解释这一点,那就太好了。我可以理解错误代码,它的含义,但不知道是什么原因或如何修复它:

错误代码:

2014-07-24 13:19:27.237 Films 2[22583:364445] -[UICollectionViewCell filmTitle]: unrecognized selector sent to instance 0x7a185600
2014-07-24 13:19:27.240 Films 2[22583:364445] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UICollectionViewCell filmTitle]: unrecognized selector sent to instance 0x7a185600'
*** First throw call stack:
(
    0   CoreFoundation                      0x0058d646 __exceptionPreprocess + 182
    1   libobjc.A.dylib                     0x01f058bf objc_exception_throw + 44
    2   CoreFoundation                      0x00594fb5 -[NSObject(NSObject) doesNotRecognizeSelector:] + 277
    3   CoreFoundation                      0x004de617 ___forwarding___ + 1047
    4   CoreFoundation                      0x004de1de _CF_forwarding_prep_0 + 14
    5   Films 2                             0x00100954 _TFC21Films_223homeTableViewController14collectionViewfS0_FTGSQCSo16UICollectionView_22cellForItemAtIndexPathGSQCSo11NSIndexPath__GSQCSo20UICollectionViewCell_ + 980
    6   Films 2                             0x00100e55 _TToFC21Films_223homeTableViewController14collectionViewfS0_FTGSQCSo16UICollectionView_22cellForItemAtIndexPathGSQCSo11NSIndexPath__GSQCSo20UICollectionViewCell_ + 101
    7   UIKit                               0x0149747d -[UICollectionView _createPreparedCellForItemAtIndexPath:withLayoutAttributes:applyAttributes:] + 258
    8   UIKit                               0x01499312 -[UICollectionView _updateVisibleCellsNow:] + 4928
    9   UIKit                               0x0149d7bf -[UICollectionView layoutSubviews] + 263
    10  UIKit                               0x00e1fcf9 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 600
    11  libobjc.A.dylib                     0x01f18771 -[NSObject performSelector:withObject:] + 70
    12  QuartzCore                          0x04655f0f -[CALayer layoutSublayers] + 152
    13  QuartzCore                          0x04649d95 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 397
    14  QuartzCore                          0x04649bf0 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26
    15  QuartzCore                          0x045a925e _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 284
    16  QuartzCore                          0x045aa624 _ZN2CA11Transaction6commitEv + 392
    17  QuartzCore                          0x0466f1b9 +[CATransaction flush] + 52
    18  UIKit                               0x00d92e36 -[UIApplication _reportMainSceneUpdateFinished:] + 39
    19  UIKit                               0x00d93d2b -[UIApplication _runWithMainScene:transitionContext:completion:] + 3027
    20  UIKit                               0x00dac3bb __84-[UIApplication _handleApplicationActivationWithScene:transitionContext:completion:]_block_invoke + 59
    21  UIKit                               0x00d923c1 -[UIApplication workspaceDidEndTransaction:] + 155
    22  FrontBoardServices                  0x035c405e __37-[FBSWorkspace clientEndTransaction:]_block_invoke_2 + 71
    23  FrontBoardServices                  0x035c3ca4 __40-[FBSWorkspace _performDelegateCallOut:]_block_invoke + 54
    24  FrontBoardServices                  0x035d56e5 __31-[FBSSerialQueue performAsync:]_block_invoke + 26
    25  CoreFoundation                      0x004b1450 __CFRUNLOOP_IS_CALLING_OUT_TO_A_BLOCK__ + 16
    26  CoreFoundation                      0x004a66f3 __CFRunLoopDoBlocks + 195
    27  CoreFoundation                      0x004a654b __CFRunLoopRun + 2715
    28  CoreFoundation                      0x004a57eb CFRunLoopRunSpecific + 443
    29  CoreFoundation                      0x004a561b CFRunLoopRunInMode + 123
    30  UIKit                               0x00d91dd0 -[UIApplication _run] + 571
    31  UIKit                               0x00d953d6 UIApplicationMain + 1526
    32  Films 2                             0x00102841 top_level_code + 97
    33  Films 2                             0x0010287b main + 43
    34  libdyld.dylib                       0x02458ac9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

当这崩溃时,它会突出显示cell.filmTitle.text = "The Hunger Games: Catching Fire" 行,并且我检查了所有插座是否按应有的方式连接,并且据我所知,一切都应该连接良好。

【问题讨论】:

  • 可能不是实际问题,但在您的 viewDidLoad 中不调用 super.viewDidLoad() 可能会导致一些奇怪的事情
  • 哦,好的,谢谢。这并没有解决问题,但感谢您的提示
  • 您是否尝试过删除插座连接并重新连接?在将 XCode 从 beta 3 升级到 beta 4 并重新连接插座时,我遇到了类似的崩溃问题。
  • @zisoft 我删除了到单元格和情节提要的所有出口连接,以及重新连接集合视图的委托和数据源,但不幸的是问题仍然存在......无论如何,谢谢

标签: cocoa-touch swift lldb xcode6


【解决方案1】:

您注册了错误的类以供重复使用。你正在使用这个。

onThisWeekCollectionView.registerClass(UICollectionViewCell.self, forCellWithReuseIdentifier: "Home Whats On Collection View Cell")

什么时候你应该使用你的子类。

onThisWeekCollectionView.registerClass(homeWhatsOnCellectionCell.self, forCellWithReuseIdentifier: "Home Whats On Collection View Cell")

这让我想到了你错误中有意义的部分。

-[UICollectionViewCell filmTitle]: 无法识别的选择器发送到实例

意味着在某个地方,您尝试在 UICollectionViewCell 的一个实例上调用 filmTitle 方法,而该实例没有响应选择器,从而导致崩溃。在这种情况下,即使您在 cellForRowAtIndexPath 中向下转换,用于重用的类仍然是您的单元超类,它不会响应您的子类添加的任何方法/属性。

注意:按照标准命名约定,您的类应以大写字母开头。

【讨论】:

  • 啊,谢谢,就是这样。不幸的是,现在我在 cell.filmTitle.text 行上遇到了一个致命错误“在展开可选值时意外发现 nil”。通常这会暗示我没有正确连接filmTitle插座,但在这种情况下我仍然收到此错误。
  • 感谢您指出约定 - 我在任何地方都找不到 Swift 约定,所以我只使用我的 Pythonic 约定。我会改变那些
  • @Hyperion 我的第一个也是一个未链接的出口。我会先取消链接然后重新链接网点,以确保没有出现任何问题。没问题,还没有正式的样式指南发布,所以这不是一成不变的,但是 Swift 中的一些命名约定是从 Objective C 借来的。
  • 嗯,我已经删除并重新链接了所有与单元有关的网点,以及删除和重新编写与这些网点有关的代码,但我仍然遇到同样的错误.有什么想法吗?或者这是我应该问另一个问题的那种事情?
  • @Hyperion 没有什么能真正吸引我。我认为这可能适合作为一个新问题(前提是您在任何地方都找不到重复项)。抱歉,我无法提供更多帮助。
猜你喜欢
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 2017-10-01
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多