當前位置: 首頁>>編程示例 >>用法及示例精選 >>正文


Swift isKnownUniquelyReferenced(_:)用法及代碼示例

用法一

函數

isKnownUniquelyReferenced(_:)

返回一個布爾值,指示給定對象是否已知具有單個強引用。

聲明

func isKnownUniquelyReferenced<T>(_ object: inout T) -> Bool where T : AnyObject

返回值

true 如果已知 object 有一個強引用;否則,false

參數

object

一個類的實例。這個函數做not修改objectinout 的使用是一個實現工件。

詳述

isKnownUniquelyReferenced(_:) 函數對於實現值類型的深度存儲的copy-on-write 優化很有用:


mutating func update(withValue value: T) {
    if !isKnownUniquelyReferenced(&myStorage) {
        myStorage = self.copiedStorage()
    }
    myStorage.update(withValue: value)
}

從布爾表達式中調用 isKnownUniquelyReferenced(_:) 時要小心。在調試版本中,&&|| 表達式左側的實例在評估右側時仍可能被引用,從而增加了實例的引用計數。例如,此版本的 update(withValue) 方法將在每次調用時重新複製 myStorage


// Copies too frequently:
mutating func badUpdate(withValue value: T) {
    if myStorage.shouldCopy || !isKnownUniquelyReferenced(&myStorage) {
        myStorage = self.copiedStorage()
    }
    myStorage.update(withValue: value)
}

為避免此行為,請將調用 isKnownUniquelyReferenced(_:) 交換到左側或將第一個表達式的結果存儲在局部常量中:


mutating func goodUpdate(withValue value: T) {
    let shouldCopy = myStorage.shouldCopy
    if shouldCopy || !isKnownUniquelyReferenced(&myStorage) {
        myStorage = self.copiedStorage()
    }
    myStorage.update(withValue: value)
}

isKnownUniquelyReferenced(_:) 僅檢查對給定對象的強引用——如果 object 有其他弱引用或無主引用,則結果可能仍然是 true 。因為弱引用和無主引用不能是對象的唯一引用,所以將弱引用或無主引用作為 object 傳遞總是會導致 false

如果作為 object 傳遞的實例同時被多個線程訪問,則此函數可能仍會返回 true 。因此,您隻能從具有適當線程同步的變異方法中調用此函數。這將確保 isKnownUniquelyReferenced(_:) 僅在確實有一個訪問器或存在競爭條件時才返回 true,這已經是未定義的行為。

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

用法二

函數

isKnownUniquelyReferenced(_:)

返回一個布爾值,指示給定對象是否已知具有單個強引用。

聲明

func isKnownUniquelyReferenced<T>(_ object: inout T?) -> Bool where T : AnyObject

返回值

true 如果已知 object 有一個強引用;否則,false。如果 objectnil ,則返回值為 false

參數

object

一個類的實例。這個函數做not修改objectinout 的使用是一個實現工件。

詳述

isKnownUniquelyReferenced(_:) 函數對於實現值類型的深度存儲的copy-on-write 優化很有用:


mutating func update(withValue value: T) {
    if !isKnownUniquelyReferenced(&myStorage) {
        myStorage = self.copiedStorage()
    }
    myStorage.update(withValue: value)
}

isKnownUniquelyReferenced(_:) 僅檢查對給定對象的強引用——如果 object 有其他弱引用或無主引用,則結果可能仍然是 true 。因為弱引用和無主引用不能是對象的唯一引用,所以將弱引用或無主引用作為 object 傳遞總是會導致 false

如果作為 object 傳遞的實例同時被多個線程訪問,則此函數可能仍會返回 true 。因此,您隻能從具有適當線程同步的變異方法中調用此函數。這將確保 isKnownUniquelyReferenced(_:) 僅在確實有一個訪問器或存在競爭條件時才返回 true,這已經是未定義的行為。

可用版本

iOS 8.0+, iPadOS 8.0+, macOS 10.10+, Mac Catalyst 13.0+, tvOS 9.0+, watchOS 2.0+

相關用法


注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 isKnownUniquelyReferenced(_:)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。