Conforming to the NSSecureCoding protocol indicates that an object handles encoding and decoding instances of itself in a manner that is robust against object substitution attacks.


Historically, many classes decoded instances of themselves like this:

if let object = decoder.decodeObjectForKey("myKey") as MyClass {
} else {

This technique is potentially unsafe because by the time you can verify the class type, the object has already been constructed, and if this is part of a collection class, potentially inserted into an object graph.

In order to conform to NSSecureCoding:

  • An object that does not override init(coder:) can conform to NSSecureCoding without any changes (assuming that it is a subclass of another class that conforms).

  • An object that does override initWithCoder: must decode any enclosed objects using the decodeObjectOfClass:forKey: method. For example:

    let obj = decoder.decodeObjectOfClass(MyClass.self, forKey: "myKey")

    In addition, the class must override its NSSecureCoding method to return true.

For more information about how this relates to the NSXPC API, see Creating XPC Services in Daemons and Services Programming Guide.


Inherits From

Adopted By