2014-07-19 81 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 - >添加類對實體