Swift:CoreData库中的断点

时间:2014-07-19 15:18:43

标签: xcode debugging core-data swift

使用Swift的XCode 6 Beta 3。

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

enter image description here

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

因为此断点设置在机器代码的某处,断点检查器不显示任何断点,所以我无法删除它。

有谁知道如何摆脱它?

非常感谢。


修改 回溯输出:

  

(lldb)bt   * thread#1:tid = 0x1d68b0,0x000000010a2f7fcd libswift_stdlib_core.dylib swift_dynamicCastClassUnconditional + 77, queue = 'com.apple.main-thread', stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0) * frame #0: 0x000000010a2f7fcd libswift_stdlib_core.dylib swift_dynamicCastClassUnconditional + 77       帧#1:0x000000010a0fbb85 GPS跟踪GPS_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) - &gt; TrackListTableViewController.swift上的Swift.Optional + 87: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 QuartzCore CA :: Layer :: layout_if_needed(CA :: Transaction *)+ 380       帧#9:0x000000010b9be02e QuartzCore CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 24 frame #10: 0x000000010b92cf16 QuartzCore CA :: Context :: commit_transaction(CA :: Transaction *)+ 242       帧#11:0x000000010b92e022 QuartzCore CA::Transaction::commit() + 390 frame #12: 0x000000010b92e68d QuartzCore CA :: 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 CoreFoundation CFRunLoopRunSpecific + 470       帧#17:0x000000010e9e9abf GraphicsServices GSEventRunModal + 161 frame #18: 0x000000010bb39cf8 UIKit UIApplicationMain + 1282       帧#19:0x000000010a0e6a5d在AppDelegate.swift上的GPS跟踪top_level_code + 77 at AppDelegate.swift:36 frame #20: 0x000000010a0e6a9a GPS Track main + 42:0       帧#21:0x000000010d2e7145 libdyld.dylib`start + 1   (lldb)

8 个答案:

答案 0 :(得分:8)

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

// 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)
    }
}

<强> SOLUTION:

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

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

感谢大家的帮助!

答案 1 :(得分:2)

您是否设置了All Exception断点?

enter image description here

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

如果添加异常断点,可能会在CoreData中中断。解决方案是删除或禁用异常断点。

答案 2 :(得分:2)

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

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

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

但是,如果您不进行类型检查,您仍可能会遇到这种断点。我怀疑它在测试版4中是一个断点,但在下一个测试版中会崩溃。

我在我的代码中解决了这个问题,因为我正在将从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的一个错误,但无论如何这都更安全。

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

答案 3 :(得分:2)

我根据https://devforums.apple.com/message/1016337#1016337

中的信息修复了此问题的版本
  • 制作NSManagedObject派生类及其相关属性public
  • 不要将其源文件包含在测试目标的编译源
  • 导入测试文件中的应用目标 - 例如import MyApp中的MyClassTests.swift

答案 4 :(得分:2)

在您的核心数据*.xcdatamodeld文件中,在您的实体的类名称前加上您的应用名称。完成后它应该看起来像这样:

entity class name prefix

答案 5 :(得分:0)

感谢上次帮助!!!

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

答案 6 :(得分:0)

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

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

  2. 您必须在课程上方添加代码 @objc(yourClass)

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

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

答案 7 :(得分:0)

对于使用Xcode 6.2

的任何人
  • 对您的班级进行@objc次更改,即@objc(className)
  • 接下来转到*.xcdatamodeld - &gt; Configurations(如果未指定,则为默认值) - &gt;为实体添加类