2016-04-15 3 views
1

Описываю проблему. У меня есть объект CoreData «Новый». Я использую fetchedResultsController с tableView для представления объектов. Проблема в том, что приложение пытается обновить ярлык, он разбился (ячейка имеет две метки, но приложение всегда сбой в том же предложении, обновление одного и того же ярлыка ...).Основные данные: приложение разбилось при использовании атрибута 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.... Из document, идентифицированного в этом ответе (документация Клана), кажется, что технически проблема не возникает, если персонаж сразу после «нового» является строчной буквой. Таким образом, newbody будет в порядке, тогда как newBody нет. Кроме того, для полноты картины, следующие префиксы следует также избегать (хотя они вряд ли выбор для имен атрибутов):

  • Alloc
  • копия
  • mutableCopy
  • INIT

Интересно, Xcode (по крайней мере, версия 7.3, не уверен в предыдущих версиях) не позволит эти имена атрибутов в Objective-C, выдавая ошибку компилятора:

Property follows Cocoa naming convention for returning 'owned' objects

К сожалению, компилятор Swift не дает никаких ошибок или предупреждений.

Смежные вопросы