当前位置: 首页>>编程示例 >>用法及示例精选 >>正文


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