2015-02-21 2 views
2

Предположим, что я создал файл с NSKeyedArchiver, и файл был изменен/заменен третьими лицами. Поэтому, когда я пытаюсь разархивировать файл. Не следует инициализировать объект.Как заставить initWithCoder() стать отказоустойчивым при распаковке недопустимого файла?

Но initWithCoder() не является отказоустойчивым. Поэтому я не могу вернуть нуль, когда данные недействительны. Но в то же время. NSKeyedUnarchiver может вернуть значение nil при открытии объекта. Поэтому я действительно путаюсь, что вернуть объект nil в initWithCoder().

Спасибо.

ответ

1

Вы можете вернуть nil из awakeAfterUsingCoder(_:)

От the document:

Вы должны вернуть себя от initWithCoder:. Если у вас есть дополнительные потребности, требующие замены другого объекта после декодирования, вы можете сделать это в awakeAfterUsingCoder:.

class Foo: NSObject, NSCoding { 
    override init() {} 
    required init(coder aDecoder: NSCoder) { 
    } 
    func encodeWithCoder(aCoder: NSCoder) { 
    } 
    override func awakeAfterUsingCoder(aCoder: NSCoder) -> AnyObject? { 
     return nil 
    } 
} 

let data = NSKeyedArchiver.archivedDataWithRootObject(Foo()) 
let obj: AnyObject? = NSKeyedUnarchiver.unarchiveObjectWithData(data) // -> nil 
+0

Спасибо. Это было бы единственным решением проблемы. –

1

Я думаю, что это может быть изменен в Swift 2.0. Глядя на API, то инициализации обнуляемая:

@protocol NSCoding 

- (void)encodeWithCoder:(NSCoder *)aCoder; 
- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder; // NS_DESIGNATED_INITIALIZER 

@end 

Xcode версия 7.0 бета 6 (7A192o)

+0

Это правда - теперь вы можете вернуть 'nil' из' init? (Coder:) 'в Swift. Но Xcode все еще жалуется, если вы попытаетесь вернуть 'nil' из' initWithCoder: 'в Objective-C. –

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