Xcode Swift:CoreData库中的断点

Xcode Swift:CoreData库中的断点,xcode,debugging,core-data,swift,Xcode,Debugging,Core Data,Swift,使用Swift的XCode 6 Beta 3 在我的应用程序中,我使用CoreData。当我在模拟器中运行我的应用程序时,XCode会弹出调试器,并在CoreData库中的某个位置设置一个断点(参见屏幕截图)。这发生在多个CoreData函数上,例如在插入新记录或从实体获取记录时。断点位置始终相同 这是非常烦人的。当我的应用程序从一个实体获取10条记录时,我必须按下“继续程序执行”按钮10次 因为这个断点是在机器代码中的某个地方设置的,所以断点检查器不显示任何断点,所以我无法删除它 有人知道如

使用Swift的XCode 6 Beta 3

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

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

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

有人知道如何摆脱它吗

非常感谢


编辑: 回溯输出:

(lldb)英国电信 *线程#1:tid=0x1d68b0,0x000000010a2f7fcd libswift\u stdlib\u core.dylib
swift\u dynamiccast无条件+77,队列='com.apple.main thread',停止原因=EXC\u断点(代码=EXC\u I386\u BPT,子代码=0x0)
*帧0:0x000000010a2f7fcd libswift\u stdlib\u core.dylib
swift\u dynamiccast+77 帧#1:0x000000010a0fbb85 GPS轨迹
GPS_Track.TrackListTableViewController.tableView(tableView=)(Swift.ImplicitlyUnwrappedOptional,cellForRowAtIndexPath:Swift.ImplicitlyUnwrappedOptional)->Swift.Optional+1125 at TrackListTableViewController.Swift:53
帧#2:0x000000010a0fc937 GPS轨迹
@objc GPS_Track.TrackListTableViewController.tableView(GPS_Track.TrackListTableViewController)(Swift.ImplicitlyUnwrappedOptional,cellforrowatinexpath:Swift.ImplicitlyUnwrappedOptional)->Swift.Optional+87 at TrackListTableViewController.Swift:0 帧#3:0x000000010bc2f218 UIKit
-[UITableView\u createPreparedCellForGlobalRow:withIndexPath:willDisplay:+508
帧#4:0x000000010bc0f340 UIKit
-[UITableView\u updateVisibleCellsNow:isRecursive:+2845 框架#5:0x000000010bc24fea UIKit
-[UITableView布局子视图]+213
帧#6:0x000000010bbb1ebd UIKit
-[UIView(CALayerDelegate)布局层的子层:][519 帧#7:0x000000010b9c9598 QuartzCore
-[CALayer layoutSublayers]+150
帧#8:0x000000010b9be1be QuartzCore
CA::Layer::layout(如果需要)(CA::Transaction*)+380 帧#9:0x000000010b9be02e QuartzCore
CA::Layer::layout_和_display_(如果需要)(CA::Transaction*)+24
帧#10:0x000000010b92cf16 QuartzCore
CA::Context::commit#u事务(CA::transaction*)+242 帧#11:0x000000010b92e022 QuartzCore
CA::Transaction::commit()+390
帧#12:0x000000010b92e68d QuartzCore
CA::Transaction::observer_回调(uu CFRunLoopObserver*,无符号长,void*)+89 帧#13:0x000000010ab52927 CoreFoundation
\uuu CFRUNLOOP\u正在调用一个观察者回调函数\uuu+23
帧#14:0x000000010ab52880 CoreFoundation
\uu cfrunloopdoobserver+368 帧#15:0x000000010ab480d3 CoreFoundation
\uuu CFRunLoopRun+1123
帧#16:0x000000010ab47a06 CoreFoundation
CFRunLoopRunSpecific+470 帧#17:0x000000010e9e9abf图形服务
GSEventRunModal+161
帧18:0x000000010bb39cf8 UIKit
UIApplicationMain+1282 帧#19:0x000000010a0e6a5d GPS轨迹<代码>最高层代码+77在AppDelegate。swift:36 帧#20:0x000000010a0e6a9a GPS轨道main+42在AppDelegate处。swift:0 帧#21:0x000000010d2e7145 libdyld.dylib`start+1 (lldb)


是否设置了所有异常断点

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


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

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

// 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)
    }
}
//用户类,在User.swift中定义
类用户:NSManagedObject{
@NSVAR名称:字符串
@NSVAR托管名称:字符串
}
// --------------
//在其他地方编码
let users=moc.executeFetchRequest(fetchRequest,错误:&error)
对于用户中的对象{

让user=object作为user/,而上述答案在技术上都是正确的

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

@Zaph也可能起作用,因为你根本不在听,如果它确实是一个bug,它应该阻止它出现

但是,如果不进行类型检查,您可能仍然会遇到这种断点。我怀疑它在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中的一个bug,但无论如何,这是更安全的


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

我根据中的信息修复了此问题的版本

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

    • 谢谢你最后的帮助

      • 将NSManagedObject派生类及其相关属性公开
      • 不要将其源文件包含在测试目标的
        func createMyEntity() -> MyClass{ 
           if  let entity : MyClass = NSEntityDescription.insertNewObjectForEntityForName("MyClass", inManagedObjectContext: self.managedObjectContext) as? MyClass
            {
                return entity;
            } 
            return nil;
        }