2014-07-19 52 views
9

使用Swift的XCode 6 Beta 3。Swift:CoreData库中的断点

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

enter image description here

这是非常恼人。当我的App从一个实体取得10条记录时,我必须按下继续程序执行按钮10次。

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

有谁知道如何摆脱它?

非常感谢。


编辑: 回溯输出:

(LLDB)BT *线#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 Track 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) - > Swif t.Optional + 87在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 QuartzCore CA :: Layer :: layout_if_needed(CA :: Transaction *)+ 380 frame#9:0x000000010b9be02e QuartzCore CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 24 frame #10: 0x000000010b92cf16 QuartzCore CA :: Context :: commit_transaction(CA :: Transaction *)+ 242 frame#11 :0x000000010b92e022 QuartzCore CA::Transaction::commit() + 390 frame #12: 0x000000010b92e68d QuartzCore CA :: Transaction :: observer_callback(__ CFRunLoopObserver *,unsigned long,void *)+ 89 frame#13:0x000000010ab52927 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 23 frame #14: 0x000000010ab52880 CoreFoundation __CFRunLoopDoObserver + 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 GPS轨道top_level_code + 77 at AppDelegate.swift:36 frame #20: 0x000000010a0e6a9a GPS Track主+ 42 AppDelegate.swift:0 帧#21:0x000000010d2e7145 libdyld.dylib`开始+ 1 (lldb)

+0

backtrace请致电 – akashivskyy

+0

@akashivskyy:对不起,我不知道你的意思 – zisoft

+0

你能否发表第th e完全回溯,你在控制台中获得了什么? (如果没有,在发生中断时输入“bt”) – akashivskyy

回答

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指令,使自定义对象类的可见目标C:

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

感谢所有为您帮帮我!

+1

有趣的是,您必须说'@objc(User)'还是说足以说' @ objc'孤单? – matt

+0

我已经这么做了,我仍然击中了那个突破点。 – AppHandwerker

+1

@matt @zisoft我试着单独使用'@ objc'关键字,它只在我的子类中为我工作,当我像'@objc(User)'那样专门调用类时 –

2

您是否设置了所有异常断点?

enter image description here

相反,苹果的最佳实践CoreData使用控制的正常流动异常。

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

+0

是的,这工作,虽然烦人,它不理想。正如我想听所有例外,只有有效的;) – AppHandwerker

+0

同样在这里,有没有办法只禁用这种异常?即使禁用了所有断点,测试也会在每个类型转换中断裂,但仅在测试环境中... – Cyril

2

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

@zisoft是正确的,但是如果你使用自定义的NSManagedObject类,那么你应该总是使用@objc(用户),不仅仅是这个破发点的原因。

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

停止但是你仍然可能会碰到这样的破发点的,如果你不类型检查。我怀疑这是测试版4的一个断点,但会在下一个测试版中崩溃。

我解决了问题,在我的代码,因为我是在返回的AnyObject从insertNewObjectForEntityForName收到的管理对象,后来说因为MyClass的,当我用它击中。很好,因为我知道这是我的课。但actualy应该做这样的事情

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

显然,这只是一个例子,但如果你是打在其他地方的破发点,希望这一个很好的参考。

没有顶住,这仍然可能只是在Xcode的beta 4版本的错误,但是这是比较安全呢。

更新 - 这也检查你的数据模型类的名字,因为它后来经过这里警告的,这也可能是为什么断点被击中匹配。

2

https://devforums.apple.com/message/1016337#1016337

  • 固定我的版本的基础上的信息这一问题做出NSManagedObject派生类及其相关属性public
  • 不包括在测试目标的编译源代码
  • 其源文件
  • 在测试文件中导入应用目标 - 例如import MyAppMyClassTests.swift
0

由于最后帮助!

  • 使NSManagedObject派生类及其相关属性的公共
  • 不包括在测试目标的编译源代码的源文件
  • 导入应用目标的测试文件 - 例如,进口MyApp的MyClassTests。swift
2

在您的核心数据*.xcdatamodeld文件中,将实体的类名前缀为您的应用程序名称。它应该是这个样子,当你完成:

entity class name prefix

0

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

  1. 你必须在你的实体,模型设定* Model.xcdatamodeld物业“类”同一名称例如:名称=即时通讯类=聊天

  2. 您必须添加代码@ objc(yourClass)

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

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

0

对于使用Xcode 6.2

  • @objc修改你的类即@objc(className)
  • 下一页去*.xcdatamodeld任何人 - (如果没有指定默认值)>Configurations - >添加类对实体