Ответ 1
NSZone
больше не используется в Objective-C в течение длительного времени. И переданный аргумент zone
игнорируется. Цитата из allocWithZone...
docs:
Этот метод существует по историческим причинам; Зоны памяти больше не используются Objective-C.
Вы также можете игнорировать его.
Вот пример того, как соответствовать протоколу NSCopying
.
class GameModel: NSObject, NSCopying {
var someProperty: Int = 0
required override init() {
// This initializer must be required, because another
// initializer 'init(_ model: GameModel)' is required
// too and we would like to instantiate 'GameModel'
// with simple 'GameModel()' as well.
}
required init(_ model: GameModel) {
// This initializer must be required unless 'GameModel'
// class is 'final'
someProperty = model.someProperty
}
func copyWithZone(zone: NSZone) -> AnyObject {
// This is the reason why 'init(_ model: GameModel)'
// must be required, because 'GameModel' is not 'final'.
return self.dynamicType.init(self)
}
}
let model = GameModel()
model.someProperty = 10
let modelCopy = GameModel(model)
modelCopy.someProperty = 20
let anotherModelCopy = modelCopy.copy() as! GameModel
anotherModelCopy.someProperty = 30
print(model.someProperty) // 10
print(modelCopy.someProperty) // 20
print(anotherModelCopy.someProperty) // 30
PS Этот пример предназначен для Xcode Version 7.0 beta 5 (7A176x). Особенно dynamicType.init(self)
.
Изменить для Swift 3
Ниже приведена реализация метода copyWithZone для Swift 3, поскольку dynamicType
устарел:
func copy(with zone: NSZone? = nil) -> Any
{
return type(of:self).init(self)
}