Returns a Boolean value indicating whether the given object is known to have a single strong reference.
The isKnownUniquelyReferenced(_:)
function is useful for implementing the
copy-on-write optimization for the deep storage of value types:
mutating
func
update
(
withValue
value
:
T
) {
if
!
isKnownUniquelyReferenced
(
&
myStorage
) {
myStorage
=
self
.
copiedStorage
()
}
myStorage
.
update
(
withValue
:
value
)
}
isKnownUniquelyReferenced(_:)
checks only for strong references to the
given object---if object
has additional weak or unowned references, the
result may still be true
. Because weak and unowned references cannot be
the only reference to an object, passing a weak or unowned reference as
object
always results in false
.
If the instance passed as object
is being accessed by multiple threads
simultaneously, this function may still return true
. Therefore, you must
only call this function from mutating methods with appropriate thread
synchronization. That will ensure that isKnownUniquelyReferenced(_:)
only returns true
when there is really one accessor, or when there is a
race condition, which is already undefined behavior.
object
: An instance of a class. This function does not modify
object
; the use of inout
is an implementation artifact.
Returns: true
if object
is known to have a single strong reference;
otherwise, false
. If object
is nil
, the return value is false
.
Returns a Boolean value indicating whether the given object is known to have a single strong reference.
The
isKnownUniquelyReferenced(_:)
function is useful for implementing the copy-on-write optimization for the deep storage of value types:Use care when calling
isKnownUniquelyReferenced(_:)
from within a Boolean expression. In debug builds, an instance in the left-hand side of a&&
or||
expression may still be referenced when evaluating the right-hand side, inflating the instance's reference count. For example, this version of theupdate(withValue)
method will re-copymyStorage
on every call:To avoid this behavior, swap the call
isKnownUniquelyReferenced(_:)
to the left-hand side or store the result of the first expression in a local constant:isKnownUniquelyReferenced(_:)
checks only for strong references to the given object---ifobject
has additional weak or unowned references, the result may still betrue
. Because weak and unowned references cannot be the only reference to an object, passing a weak or unowned reference asobject
always results infalse
.If the instance passed as
object
is being accessed by multiple threads simultaneously, this function may still returntrue
. Therefore, you must only call this function from mutating methods with appropriate thread synchronization. That will ensure thatisKnownUniquelyReferenced(_:)
only returnstrue
when there is really one accessor, or when there is a race condition, which is already undefined behavior.object
: An instance of a class. This function does not modifyobject
; the use ofinout
is an implementation artifact. Returns:true
ifobject
is known to have a single strong reference; otherwise,false
.Declaration
func
isKnownUniquelyReferenced
<
T
>
(
_
object
:
inout
T
) -
>
Bool
where
T
:
AnyObject