【问题标题】:Swift: Breakpoint in CoreData librarySwift:CoreData 库中的断点
【发布时间】:2014-09-10 14:04:33
【问题描述】:

XCode 6 Beta 3 使用 Swift。

在我的应用程序中,我使用 CoreData。当我在模拟器中运行我的应用程序时,XCode 会弹出调试器,并在 CoreData 库中的某处设置断点(参见屏幕截图)。这发生在几个 CoreData 函数上,例如在插入新记录或从实体获取记录时。断点位置始终相同。

这非常烦人。当我的应用从一个实体中获取 10 条记录时,我必须按下 继续执行程序 按钮 10 次。

因为这个断点设置在机器代码的某个地方,断点检查器没有显示任何断点,所以我无法删除它。

有谁知道如何摆脱它?

非常感谢。


编辑: 回溯输出:

(lldb) bt * 线程 #1: tid = 0x1d68b0, 0x000000010a2f7fcd libswift_stdlib_core.dylibswift_dynamicCastClassUnconditional + 77, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0) * frame #0: 0x000000010a2f7fcd libswift_stdlib_core.dylibswift_dynamicCastClassUnconditional + 77 帧 #1: 0x000000010a0fbb85 GPS TrackGPS_Track.TrackListTableViewController.tableView (tableView=<unavailable>)(Swift.ImplicitlyUnwrappedOptional<ObjectiveC.UITableView>, cellForRowAtIndexPath : Swift.ImplicitlyUnwrappedOptional<ObjectiveC.NSIndexPath>) -> Swift.Optional<ObjectiveC.UITableViewCell> + 1125 at TrackListTableViewController.swift:53 frame #2: 0x000000010a0fc937 GPS Track@objc GPS_Track.TrackListTableViewController.tableView (GPS_Track.TrackListTableViewController)(Swift.ImplicitlyUnwrappedOptional, cellForRowAtIndexPath : Swift.ImplicitlyUnwrappedOptional) -> Swift.Optional + 87 at TrackListTableViewController.swift:0 帧#3:0x000000010bc2f218 UIKit-[UITableView _createPreparedCellForGlobalRow:withIndexPath:willDisplay:] + 508 frame #4: 0x000000010bc0f340 UIKit-[UITableView _updateVisibleCellsNow:isRecursive:] + 2845 帧 #5: 0x000000010bc24fea UIKit-[UITableView layoutSubviews] + 213 frame #6: 0x000000010bbb1ebd UIKit-[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 519 帧 #7: 0x000000010b9c9598 QuartzCore-[CALayer layoutSublayers] + 150 frame #8: 0x000000010b9be1be QuartzCoreCA::Layer::layout_if_needed(CA::Transaction*) + 380 帧 #9: 0x000000010b9be02e QuartzCoreCA::Layer::layout_and_display_if_needed(CA::Transaction*) + 24 frame #10: 0x000000010b92cf16 QuartzCoreCA::Context::commit_transaction(CA::Transaction*) + 242 帧 #11: 0x000000010b92e022 QuartzCoreCA::Transaction::commit() + 390 frame #12: 0x000000010b92e68d QuartzCoreCA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 89 帧#13:0x000000010ab52927 CoreFoundation__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 frame #14: 0x000000010ab52880 CoreFoundation__CFRunLoopDoObservers + 368 帧#15:0x000000010ab480d3 CoreFoundation__CFRunLoopRun + 1123 frame #16: 0x000000010ab47a06 CoreFoundationCFRunLoopRunSpecific + 470 帧#17:0x000000010e9e9abf GraphicsServicesGSEventRunModal + 161 frame #18: 0x000000010bb39cf8 UIKitUIApplicationMain + 1282 第 19 帧:0x000000010a0e6a5d GPS Tracktop_level_code + 77 at AppDelegate.swift:36 frame #20: 0x000000010a0e6a9a GPS Trackmain + 42 在 AppDelegate.swift:0 帧 #21: 0x000000010d2e7145 libdyld.dylib`start + 1 (lldb)

【问题讨论】:

  • @akashivskyy:对不起,我不明白你的意思
  • 你能发布完整的回溯吗,你在控制台中得到的? (如果没有,请在中断发生时输入bt
  • 这是崩溃而不是断点。您需要提供回溯来解决问题。请在控制台中 (lldb) 后键入bt 并复制并粘贴您的问题
  • 编辑了我的帖子以包含回溯
  • 我的代码中根本没有断点

标签: xcode debugging core-data swift


【解决方案1】:

我进一步追查:只有在为实体使用自定义对象类时才会出现问题。示例:

// User class, defined in User.swift
class User: NSManagedObject {
    @NSManaged var name: String
    @NSManaged var firstname: String
}


// --------------
// code somewhere else
let users = moc.executeFetchRequest(fetchRequest, error: &error)

for object in users {
    let user = object as User   // <-- breakpoint fired here
        println(user.name)
    }
}

解决方案:

需要使用@objc 指令使自定义对象类对Objective C 可见:

// User class, defined in User.swift
@objc(User)    // <-- required!
class User: NSManagedObject {
    @NSManaged var name: String
    @NSManaged var firstname: String
}

感谢大家的帮助!

【讨论】:

  • 想知道会很有趣:你必须说 @objc(User) 还是单独说 @objc 就足够了?
  • 我已经在这样做了,我仍然在达到那个断点。
  • @matt @zisoft 我尝试单独使用@objc 关键字,当我特别像@objc(User) 那样调用类时,它只在我的子类中对我有用
  • @WorkingDev 非常有用,感谢您的报告!
  • @zisoft 我已经尝试将@objc(CLASS) 添加到 .swift 文件中,但我仍然遇到断点。我还有什么遗漏的吗?
【解决方案2】:

您是否设置了 All Exception 断点?

与 Apple 的最佳实践相反,CoreData 在正常的控制流中使用异常。

如果您添加异常断点,您可能会中断 CoreData。解决方法是移除或禁用异常断点。

【讨论】:

  • 是的,这行得通,尽管令人讨厌的是它并不理想。因为我想听所有例外,只有有效的;)
  • 这里也一样,有没有办法只禁用这种异常?即使禁用了所有断点,测试也会在每次类型转换时中断,但仅在测试环境中......
【解决方案3】:

虽然以上答案在技术上都是正确的

@zisoft 是对的,但是如果您使用自定义 NSManagedObject 类,那么您应该始终使用 @objc(User),而不仅仅是因为这个断点。

@Zaph 也可以工作,因为你基本上没有在听,如果它确实是一个错误,它应该阻止它出现

但是,如果您不进行类型检查,您仍然可能会遇到这种断点。我怀疑这是 beta 4 中的一个断点,但在下一个 beta 中会成为崩溃。

我在我的代码中解决了这个问题,因为我正在将从 insertNewObjectForEntityForName 接收的托管对象返回为 AnyObject,然后在我使用它时说为 myclass。很好,因为我知道这是我的课。但实际上应该做这样的事情

func createMyEntity() -> MyClass{ 
   if  let entity : MyClass = NSEntityDescription.insertNewObjectForEntityForName("MyClass", inManagedObjectContext: self.managedObjectContext) as? MyClass
    {
        return entity;
    } 
    return nil;
}

显然这只是一个例子,但如果你在其他地方遇到了断点,那么希望这是一个很好的参考。

尽管如此,这仍然可能只是 xcode Beta 4 中的一个错误,但无论如何这更安全。

更新——它还会检查您的数据模型类名称是否与稍后通过此处的警告匹配,这也可能是断点被命中的原因。

【讨论】:

    【解决方案4】:

    我根据https://devforums.apple.com/message/1016337#1016337 中的信息修复了这个问题的版本

    • 制作NSManagedObject派生类及其相关属性public
    • 不要将其源文件包含在测试目标的编译源中
    • 在测试文件中导入应用目标 -- 例如, import MyApp in MyClassTests.swift

    【讨论】:

      【解决方案5】:

      在您的 Core Data *.xcdatamodeld 文件中,在您的实体的类名称前加上您的应用名称。完成后应该是这样的:

      【讨论】:

        【解决方案6】:

        感谢最后的帮助!!!

        • 公开 NSManagedObject 派生类及其相关属性
        • 不要将其源文件包含在测试目标的编译源中
        • 在测试文件中导入应用目标——例如,在 MyClassTests.swift 中导入 MyApp

        【讨论】:

          【解决方案7】:

          以下帮助了我! 如果我撤消其中一项设置,断点错误会再次出现!

          1. 您必须在属性“Class”中的 *Model.xcdatamodeld 中为您的实体模型设置相同的名称示例:Name=Chat Class=Chat

          2. 你必须在你的类上面添加代码@objc(yourClass)

          图片1: http://i.stack.imgur.com/xoxtu.png

          图片2: http://i.stack.imgur.com/LkYYq.png

          【讨论】:

            【解决方案8】:

            对于任何使用Xcode 6.2的人

            • @objc 更改为您的班级,即@objc(className)
            • 接下来转到*.xcdatamodeld -> Configurations(如果未指定则默认)-> 针对实体添加类

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2015-03-09
              • 2011-10-29
              • 1970-01-01
              • 1970-01-01
              • 2023-03-16
              • 2012-06-27
              相关资源
              最近更新 更多