私はこの問題について説明します。私はCoreDataエンティティ "New"を持っています。私は、オブジェクトを提示するためにtableViewでfetchedResultsControllerを使用しています。問題は、アプリケーションがラベルを更新しようとしたときにクラッシュした(セルに2つのラベルがありますが、同じラベルで常に同じアプリケーションでクラッシュして、同じラベルを更新しています)。コアデータ:アプリケーションがNSManagedObject属性にアクセスするとクラッシュしました
いくつかのコードここで:
- CoreDataManagerの定義である: ここ
{
// MARK: - Shared Instance
/**
* This class variable provides an easy way to get access
* to a shared instance of the CoreDataStackManager class.
*/
class func sharedInstance() -> CoreDataStackManager {
struct Singleton {
static let instance = CoreDataStackManager()
}
return Singleton.instance
}
// MARK: - The Core Data stack. The code has been moved, unaltered, from the AppDelegate.
lazy var applicationDocumentsDirectory : NSURL = {
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
return urls[urls.count-1]
}()
lazy var managedObjectModel: NSManagedObjectModel = {
let modelURL = NSBundle.mainBundle().URLForResource("Model", withExtension: "momd")!
return NSManagedObjectModel(contentsOfURL: modelURL)!
}()
lazy var persistentStoreCoordinator: NSPersistentStoreCoordinator? = {
let coordinator: NSPersistentStoreCoordinator? = NSPersistentStoreCoordinator(managedObjectModel: self.managedObjectModel)
let url = self.applicationDocumentsDirectory.URLByAppendingPathComponent(SQLITE_FILE_NAME)
var failureReason = "There was an error creating or loading the application's saved data."
do {
try coordinator?.addPersistentStoreWithType(NSSQLiteStoreType, configuration: nil, URL: url, options: nil)
} catch {
// Report any error we got.
var dict = [String: AnyObject]()
dict[NSLocalizedDescriptionKey] = "Failed to initialize the application's saved data"
dict[NSLocalizedFailureReasonErrorKey] = failureReason
dict[NSUnderlyingErrorKey] = error as NSError
let wrappedError = NSError(domain: "YOUR_ERROR_DOMAIN", code: 9999, userInfo: dict)
// Replace this with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
NSLog("Unresolved error \(wrappedError), \(wrappedError.userInfo)")
abort()
}
return coordinator
}()
lazy var managedObjectContext: NSManagedObjectContext = {
let coordinator = self.persistentStoreCoordinator
var managedObjectContext = NSManagedObjectContext(concurrencyType: .MainQueueConcurrencyType)
managedObjectContext.persistentStoreCoordinator = coordinator
return managedObjectContext
}()
// MARK: - Core Data Saving support
func saveContext() {
if managedObjectContext.hasChanges {
managedObjectContext.performBlockAndWait {
do {
try self.managedObjectContext.save()
} catch {
let nserror = error as NSError
NSLog("Unresolved error \(nserror), \(nserror.userInfo)")
abort()
}
}
}
、アプリケーションがクラッシュ:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCellWithIdentifier("HotNewsCell") as! NewsTableViewCell let new = fetchedResultsController.objectAtIndexPath(indexPath) as! New configureCell(cell, new: new) return cell } private func configureCell(cell: NewsTableViewCell, new: New) { cell.titleLabel.text = new.title /* Next line is where app crashes :(*/ cell.descriptionLabel.text = new.newBody if let url = NSURL(string: new.photoReference) { cell.activityIndicator.startAnimating() if new.image != nil { cell.imageViewNews.image = new.image cell.activityIndicator.stopAnimating() } else { let task = NetworkRequests.sharedInstance().makeImageRequestFromURL(url) { (data, error) in guard error == nil else { print(error) return } guard let data = data else { print("No data available") return } let image = UIImage(data: data) new.image = image dispatch_async(dispatch_get_main_queue()) { cell.imageViewNews.image = image cell.activityIndicator.stopAnimating() } } cell.taskToCancelifCellIsReused = task } }
私が "cell.descriptionLabel.text = new.newBody"とコメントするとアプリが完璧に動作するので、奇妙です。
ありがとうございます!
EDIT
エラーがEXC_BAD_ACCESSました。それから、NSZombieを有効にしました。エラーは「メッセージを割り当て解除されたインスタンスに送信しました」です。
アプリがクラッシュするエラーメッセージはありますか? – Kreiri
exc_bad_access。 NSZombieを有効にした後、エラーが発生しました:解放されたインスタンスにメッセージが送信されました。 – Imanol
ストーリーボード内のどこでも 'descriptionLabel'が本当であることを二重にチェックしてください。名前が付けられ、セルに正しく接続されていますか? – Koen