2015-08-26 4 views
0

У меня есть проблема, о которой я не могу придумать. У меня есть класс, определенный ниже.NSCoding неожиданно находит nil

В делегате приложения я звоню EyeGamesPrefs.loadData(), и он падает на watchList = aDecoder.decodeObjectForKey("watchList") as! [Int], говоря, что он столкнулся с нолем.

  • Если я достаньте watchList переменную, которая идентична переменной selectedConsoleIndeces, она отлично работает.

  • Если я изменю его на watchList = aDecoder.decodeObjectForKey("selectedConsoleIndeces") as! [Int], он отлично работает.

  • Если я копирую и вставляю тот же самый код в пустой проект, он отлично работает.

  • Он работает в текущем проекте на симуляторе iPhone 5, но не на симуляторе iPhone 6. В новом проекте он работает на 6.

Может кто-нибудь объяснить, почему watchList не будет работать, но selectedConsoleIndeces делает? Единственное отличие - это имя переменной! И почему это будет работать в другом проекте, но не в этом? Это просто не имеет никакого смысла.

class EyeGamesPrefs:NSObject,NSCoding { 

// This is a shared instance available throughout the app 
static var sharedInstance = EyeGamesPrefs() 

// These are various preferences used thoughout the app 
// They are saved and loaded from NSUserDefaults.standardUserDefaults() when the app launches or goes into the background 
// See the App Delegate 
var colorScheme:  Int  // index of color scheme in listOfColorSchemes 
var boughtRemoveAds: Bool 
var boughtSkins:  Bool 
var watchedTutorial: Bool 
var selectedConsoleIndeces: [Int] 
var watchList: [Int] 

override init() { 
    colorScheme  = 0 
    boughtRemoveAds = false 
    boughtSkins  = false 
    watchedTutorial = false 
    selectedConsoleIndeces = Array(0...(50 - 1)) 
    watchList = Array(0...(50 - 1)) 
    super.init() 
} 

// What to do when this object is saved to NSUserDefaults 
func encodeWithCoder(aCoder: NSCoder) { 
    aCoder.encodeObject(colorScheme, forKey: "colorScheme") 
    aCoder.encodeObject(boughtRemoveAds, forKey: "boughtRemoveAds") 
    aCoder.encodeObject(boughtSkins, forKey: "boughtSkins") 
    aCoder.encodeObject(watchedTutorial, forKey: "watchedTutorial") 
    aCoder.encodeObject(selectedConsoleIndeces, forKey: "selectedConsoles") 
    aCoder.encodeObject(watchList, forKey: "watchList") 
} 

// What to do when this object is loaded from NSUserDefaults 
required init(coder aDecoder: NSCoder) { 
    colorScheme   = aDecoder.decodeObjectForKey("colorScheme") as! Int 
    boughtRemoveAds  = aDecoder.decodeObjectForKey("boughtRemoveAds") as! Bool 
    boughtSkins   = aDecoder.decodeObjectForKey("boughtSkins") as! Bool 
    watchedTutorial  = aDecoder.decodeObjectForKey("watchedTutorial") as! Bool 
    selectedConsoleIndeces = aDecoder.decodeObjectForKey("selectedConsoles") as! [Int] 
    watchList = aDecoder.decodeObjectForKey("watchList") as! [Int] 
} 



class func savePreferences() { 
    let data = NSKeyedArchiver.archivedDataWithRootObject(EyeGamesPrefs.sharedInstance) 
    NSUserDefaults.standardUserDefaults().setObject(data, forKey: "preferences") 
    NSLog("saved preferences") 
} 

class func loadPreferences() { 
    if let data = NSUserDefaults.standardUserDefaults().objectForKey("preferences") as? NSData { 
     let prefs = NSKeyedUnarchiver.unarchiveObjectWithData(data) as! EyeGamesPrefs 
     EyeGamesPrefs.sharedInstance = prefs 
     NSLog("loaded preferences") 
    } 
} 

ответ

1

Разница заключается в том, что selectedConsoleindeces декодирует объект для ключевых «selectedConsoles» в то время как watchList ищет объект для ключа «WatchList», который возвращает «ноль». Это означает, что в вашем NSUserDefaults нет объекта с ключом «watchList».

Вы должны убедиться, что есть объект для ключа «watchList» и/или обрабатывать получаемые значения nil изящно.

Вы можете использовать следующий код, чтобы распечатать весь NSUserDefaults, чтобы проверить, если у вас есть ключ «WatchList», и если да переменная связана с ним:

println(NSUserDefaults.standardUserDefaults().dictionaryRepresentation()); 
+0

Спасибо за ваш ответ. Значение, которое записывается в NSUserDefaults, фактически является объектом sharedInstance как сериализованные данные (см. Функцию savePreferences). Если этого не было, ключевой unarchiver никогда не будет называться, поэтому я уверен, что он есть. Я проверил его, используя ваш отзыв. Проблема должна быть в процессе разборки. – Erik

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