2016-04-15 10 views
1

私はこの問題について説明します。私は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を有効にしました。エラーは「メッセージを割り当て解除されたインスタンスに送信しました」です。

+0

アプリがクラッシュするエラーメッセージはありますか? – Kreiri

+0

exc_bad_access。 NSZombieを有効にした後、エラーが発生しました:解放されたインスタンスにメッセージが送信されました。 – Imanol

+0

ストーリーボード内のどこでも 'descriptionLabel'が本当であることを二重にチェックしてください。名前が付けられ、セルに正しく接続されていますか? – Koen

答えて

1

これは、new....で始まる属性名を使用することの成果だと思います。この問題を回避するには、属性の名前を変更するだけです。

関連項目this answerも参照してください。関連性のない質問には、new...という問題があります。その答え(Clangの文書)で特定されているdocumentから、 "new"の直後の文字が小文字であれば、技術的に問題は生じないと思われます。だからnewbodyはOKですが、newBodyはそうではありません。 (彼らは属性名のためにそうな選択肢ですが)また、完全を期すために、次のプレフィックスも同様に避けるべきである:

興味深いことに

  • のalloc
  • コピー
  • mutableCopy
  • のinit、 Xcode(バージョン7.3以上、以前のバージョンは不明)は、Objective-Cでこれらの属性名を許可せず、コンパイラエラーを返します。

    Property follows Cocoa naming convention for returning 'owned' objects

    悲しいことに、Swiftコンパイラはエラーや警告を表示しません。

関連する問題