Использование decodeObject (of: forKey :) для декодирования объекта, соответствующего протоколу - PullRequest
0 голосов
/ 08 июня 2018

У меня есть протокол Objective C, который требует соответствия NSSecureCoding:

@protocol MyProtocol <NSObject, NSSecureCoding>
…
@end

У меня есть родительский объект, который хранит ссылку на объект, соответствующий MyProtocol, и я хотел бы, чтобыродительский объект также должен соответствовать NSSecureCoding.Когда я пытаюсь это сделать:

required init?(coder aDecoder: NSCoder) {

    if let childObject = aDecoder.decodeObject(of: MyProtocol.self, forKey: "childObject") {
        self. childObject = childObject
    } else {
        return nil
    }
}

я получаю ошибку: 'decodeObject(of:forKey:)' is unavailable in Swift: use generic 'decodeObjectOfClass(_:forKey:)'.

Есть ли способ использовать NSSecureCoding, если вы не знаете конкретный класс закодированного вами объекта

1 Ответ

0 голосов
/ 08 июня 2018

Весь смысл NSSecureCoding состоит в том, чтобы предотвратить этот вариант использования.Если вы не знаете класс, который вы декодируете, то злоумышленник может заставить вас декодировать в класс, который ведет себя не так, как вы ожидали для данного метода (называемого «атакой замещения»).Это была техника, используемая для атаки на системы, и NSSecureCoding было разработано, чтобы помешать ей.

Даже если бы это было не так, невозможно создать объект типа протокола.Среда выполнения не сможет узнать, сколько памяти выделить для переменных экземпляра.

Чтобы соответствовать NSSecureCoding, вы должны знать точные классы всех дочерних объектов.

...