In Swift, we have normal default typing
we have weak typing
From swift doc
"Swift also provides unsafe unowned references for cases where you need to disable runtime safety checks—for example, for performance reasons. As with all unsafe operations, you take on the responsibility for checking that code for safety.
You indicate an unsafe unowned reference by writing unowned(unsafe). If you try to access an unsafe unowned reference after the instance that it refers to is deallocated, your program will try to access the memory location where the instance used to be, which is an unsafe operation."
It seems that performance gain comes only when you use unowned(unsafe) to be precise and by default we use unowed(safe).
This is from one of the answer
unowned(safe) is a non-owning reference that asserts on access that the object is still alive. It's sort of like a weak optional reference that's implicitly unwrapped with x! every time it's accessed. unowned(unsafe) is like __unsafe_unretained in ARC—it's a non-owning reference, but there's no runtime check that the object is still alive on access, so dangling references will reach into garbage memory. unowned is always a synonym for unowned(safe) currently, but the intent is that it will be optimized to unowned(unsafe) in -Ofast builds when runtime checks are disabled.
I agree with Yannick. Your bold statements are not correct. An unowned reference must be valid for its lifetime. In an -Ounchecked
program, failure to maintain this precondition is undefined behavior. I don't mean "it crashes." I mean it is not a well-formed program; it is undefined what it does. A weak reference cannot generate undefined behavior due to its release, even under -Ounchecked
.
Using unowned
is a statement by the programmer that the reference will be valid over its entire lifetime. That's not even something Type!
asserts. !
types just assert that the reference will be valid at the point that it is accessed. That's why you can't test x == nil
on an unowned. It is not optional. It's not "optional in disguise" (like Type!
). It must always be valid.
Unlike a weak reference, however, an unowned reference is used when the other instance has the same lifetime or a longer lifetime. ... An unowned reference is expected to always have a value. —— [The Swift Programming Language]
So to your "deepest possible philosophical," unowned includes a precondition that does not exist in weak. This precondition exists outside the program, and must be proven by programmer, not the compiler, in order to ensure a well-formed program.
To whether there is a reason to use unowned
, there certainly is if we're taking an absolutest stance (as in your question). It is the tightest type in cases where the precondition is known to be true. weak
is a weaker type than unowned
; it expresses fewer preconditions. Good type theory encourages us to use the strongest (most restrictive; fewest legal values) types we can, and unowned
is a stronger type than weak
.
In a non-absolutist ("practical") sense, the result of picking a stronger type is simpler code. When you use weak
, you have to constantly re-assert the precondition that it is not nil
every time you use it and handle the cases where it is (possibly inserting fatalError
which just reinvents unowned
with more work). Using unowned
lets you assert this precondition one time. This creates simpler, more correct code. I've never used unowned
for speed. I've always used it to avoid answering over and over again "but what if it's nil?" in code where it must never be nil.
The bold sentences are not true.
Weak
is optional and can be set at any time.
Unowned
is non-optional but can be nil. If that happens and you call it your app crashs. It has to be set during initialization.
Another difference is performance, as the author stated. Unowned
does not do any checks and is slighty faster than weak
.
It better shows the relationship between classes.
You can check out this SO question for further details: What is the difference between a weak reference and an unowned reference?