使用Swift的XCode 6 Beta 3。
在我的应用程序中,我使用CoreData。当我在模拟器中运行我的应用程序时,XCode会弹出调试器,并在CoreData库中的某处设置断点(参见屏幕截图)。这在多个CoreData函数上发生,例如在插入新记录或从实体获取记录时。断点位置始终相同。
这非常烦人。当我的应用程序从实体中获取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 QuartzCoreCA::Layer::layout_and_display_if_needed(CA::Transaction*) + 24 frame #10: 0x000000010b92cf16 QuartzCore
CA :: Context :: commit_transaction(CA :: Transaction *)+ 242 帧#11:0x000000010b92e022 QuartzCoreCA::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 GraphicsServicesGSEventRunModal + 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)
答案 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断点?
与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
文件中,在您的实体的类名称前加上您的应用名称。完成后它应该看起来像这样:
答案 5 :(得分:0)
感谢上次帮助!!!
答案 6 :(得分:0)
以下帮助了我! 如果我撤消其中一个设置,断点错误会再次出现!
您必须在属性“Class”中的* Model.xcdatamodeld中为您的实体模型设置相同的名称示例:Name = Chat Class = Chat
您必须在课程上方添加代码 @objc(yourClass)
答案 7 :(得分:0)
对于使用Xcode 6.2
@objc
次更改,即@objc(className)
*.xcdatamodeld
- &gt; Configurations
(如果未指定,则为默认值) - &gt;为实体添加类