用法一
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(_:)。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。