NSZone
長い間、Objective-C では使用されなくなりました。渡されたzone
引数は無視されます。allocWithZone...
ドキュメントからの引用:
この方法は歴史的な理由から存在します。メモリ ゾーンは、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 バージョン 7.0 ベータ 5 (7A176x) 用です。特にdynamicType.init(self)
。
Swift 3の編集
以下はdynamicType
非推奨となった Swift 3 の copyWithZone メソッドの実装です。
func copy(with zone: NSZone? = nil) -> Any
{
return type(of:self).init(self)
}