用法一
isKnownUniquelyReferenced(_:)
聲明
func isKnownUniquelyReferenced<T>(_ object: inout T) -> Bool where T : AnyObject
返回值
true
如果已知 object
有一個強引用;否則,false
。
參數
object
一個類的實例。這個函數做
not
修改object
;inout
的使用是一個實現工件。
詳述
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
,這已經是未定義的行為。
可用版本
用法二
isKnownUniquelyReferenced(_:)
聲明
func isKnownUniquelyReferenced<T>(_ object: inout T?) -> Bool where T : AnyObject
返回值
true
如果已知 object
有一個強引用;否則,false
。如果 object
是 nil
,則返回值為 false
。
參數
object
一個類的實例。這個函數做
not
修改object
;inout
的使用是一個實現工件。
詳述
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
,這已經是未定義的行為。
可用版本
相關用法
- Swift KeyValuePairs flatMap(_:)用法及代碼示例
- Swift String.UTF8View first用法及代碼示例
- Swift Result.Publisher zip(_:_:_:)用法及代碼示例
- Swift Optional.Publisher reduce(_:_:)用法及代碼示例
- Swift Int8 ~(_:)用法及代碼示例
- Swift SetAlgebra isStrictSubset(of:)用法及代碼示例
- Swift UInt +(_:)用法及代碼示例
- Swift Array enumerated()用法及代碼示例
- Swift FlattenSequence prefix(_:)用法及代碼示例
- Swift Slice endIndex用法及代碼示例
- Swift LazySequence split(maxSplits:omittingEmptySubsequences:whereSeparator:)用法及代碼示例
- Swift MutableCollection partition(by:)用法及代碼示例
- Swift ReversedCollection min(by:)用法及代碼示例
- Swift RandomNumberGenerator用法及代碼示例
- Swift Dictionary.Keys shuffled()用法及代碼示例
- Swift AnySequence elementsEqual(_:)用法及代碼示例
- Swift UInt &<<(_:_:)用法及代碼示例
- Swift Optional.Publisher tryDrop(while:)用法及代碼示例
- Swift DefaultIndices endIndex用法及代碼示例
- Swift Substring.UnicodeScalarView insert(contentsOf:at:)用法及代碼示例
- Swift LazyFilterSequence dropFirst(_:)用法及代碼示例
- Swift LazySequence suffix(from:)用法及代碼示例
- Swift ArraySlice starts(with:)用法及代碼示例
- Swift Int16.Words max()用法及代碼示例
- Swift ArraySlice reduce(_:_:)用法及代碼示例
注:本文由純淨天空篩選整理自apple.com大神的英文原創作品 isKnownUniquelyReferenced(_:)。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。