アレイは、潜在的スウィフトにUnsafePointerに変換することができ、なぜですか?

オーウェン趙:

私は規則を持っています

extension CGColor {
    static func color(from color:Color) -> CGColor {
        let (r, g, b) = try! retrieveRGB(from: color.in16bitString)
        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let array = [r, g, b, CGFloat(color.alpha)]
        let unsafePointer = UnsafePointer(array)

        return CGColor(colorSpace: colorSpace, components: unsafePointer)!
    }

    private static func retrieveRGB(from in16bitString:String) throws -> (CGFloat, CGFloat, CGFloat) {
        ...
    }
}

「ダングリングポインタの 『UnsafePointer』結果の初期化」を言ったショーライン上の警告「unsafePointer = UnsafePointer(配列)しましょう」。

私は、質問を投稿だけには重複として提出されたスウィフト5でUnsafeMutablePointer警告これらの答えは役立ちません。アップルのAPIとして要求UnsafePointerパラメータとして。

しかし、私は最終的にちょうど配列だけでは作品を使用していることを発見しました。

extension CGColor {
    static func color(from color:Color) -> CGColor {
        let (r, g, b) = try! retrieveRGB(from: color.in16bitString)
        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let array = [r, g, b, CGFloat(color.alpha)]

        return CGColor(colorSpace: colorSpace, components: array)!
    }

    private static func retrieveRGB(from in16bitString:String) throws -> (CGFloat, CGFloat, CGFloat) {
        ...
    }
}

私が使用することができ、なぜ誰もが知っていArrayたときにUnsafePointer要求されていますか?

アレクサンダー - 回復モニカ:

スウィフトのメモリモデルは、オブジェクトのみが、必ずしももはや少なくとも彼らの最後の使用までに固執し、ないことが保証されます。これは、スコープの終わりまで滞在オブジェクト、例えばCとC ++とは異なります。

let unsafePointer = UnsafePointer(array)この初期化子の呼び出しが最後の使用方法であるため、動作しませんarrayその初期化子が戻った後、スウィフトは解放して自由であるarrayことは関係があることを知らないため、UnsafePointerに依存していますarray

私が使用することができ、なぜ誰もが知っていArrayたときにUnsafePointer要求されていますか?

これは、スウィフトの暗黙的な変換ルールの一つです。アレイのバッファへのポインタは、及びの寿命(アレイ構造体自体へのポインタとは異なる者注)に渡されたarrayコールが終了するまで最後に保証されます。その関数は、(それによって配列の割り当てが解除されている可能性ポイント)以降のユーザーのためのポインタを保存しようとする場合は、バグを引き起こす可能性があります。

おすすめ

転載: http://10.200.1.11:23101/article/api/json?id=377461&siteId=1