Unowned references let you refer to another object without keeping it alive, assuming it will always exist while you use it.
Unowned references for guaranteed lifetime in Swift
class SomeClass { unowned var other: OtherClass init(other: OtherClass) { self.other = other } }
An unowned reference must always point to an object that exists while you use it.
If the object is deallocated, accessing an unowned reference will cause a runtime crash.
CreditCard has an unowned reference to its Customer because the card cannot exist without the customer.class Customer { let name: String var card: CreditCard? init(name: String) { self.name = name } } class CreditCard { let number: UInt64 unowned let customer: Customer init(number: UInt64, customer: Customer) { self.number = number self.customer = customer } }
Department has an unowned reference to Company because the company always exists while the department exists.class Department { let name: String unowned let company: Company init(name: String, company: Company) { self.name = name self.company = company } } class Company { let name: String var department: Department? init(name: String) { self.name = name } }
This example shows a Person and an Apartment. The apartment has an unowned reference to the person because the person always exists while the apartment exists. When john is set to nil, both objects are deinitialized without a memory leak.
class Person { let name: String var apartment: Apartment? init(name: String) { self.name = name } deinit { print("Person \(name) is being deinitialized") } } class Apartment { let unit: String unowned let tenant: Person init(unit: String, tenant: Person) { self.unit = unit self.tenant = tenant } deinit { print("Apartment \(unit) is being deinitialized") } } var john: Person? = Person(name: "John") john!.apartment = Apartment(unit: "4B", tenant: john!) john = nil
Use unowned only when you are sure the referenced object will not be nil during the reference's lifetime.
If the referenced object might become nil, use weak instead to avoid crashes.
Accessing an unowned reference after the object is deallocated causes a runtime error.
Unowned references let you refer to another object without increasing its lifetime.
They are used when the referenced object is guaranteed to exist while you use it.
Using unowned helps avoid memory leaks from strong reference cycles.
Practice
unowned references in Swift?Solution
Step 1: Understand what
unownedmeansunownedreferences do not increase the lifetime of the object they point to.Step 2: Compare with other reference types
Unlike strong references,unowneddoes not keep the object alive, and unlike weak references, it assumes the object will always exist during use.Final Answer:
To refer to another object without increasing its lifetime -> Option DQuick Check:
Unowned references = no lifetime increase [OK]
- Confusing unowned with strong references
- Thinking unowned automatically nils out
- Assuming unowned copies the object
Person named friend?Solution
Step 1: Recall Swift syntax for unowned references
The correct syntax placesunownedbefore the variable declaration:unowned var variableName: Type.Step 2: Match the options
unowned var friend: Person matches this syntax exactly:unowned var friend: Person.Final Answer:
unowned var friend: Person -> Option AQuick Check:
Unowned keyword before var = correct syntax [OK]
- Placing 'unowned' after the variable name
- Using 'var' after 'unowned' incorrectly
- Writing 'unowned' after the type
class Owner {
var pet: Pet?
}
class Pet {
unowned var owner: Owner
init(owner: Owner) {
self.owner = owner
}
}
let owner = Owner()
owner.pet = Pet(owner: owner)
print(owner.pet?.owner === owner)What will be the output?
Solution
Step 1: Understand the relationship between Owner and Pet
Owner has an optional Pet, and Pet has an unowned reference back to Owner, meaning Pet expects Owner to exist while Pet exists.Step 2: Analyze the print statement
The print checks if the owner property of pet is the same instance as owner using identity operator===. Since pet.owner was set to owner, this is true.Final Answer:
true -> Option AQuick Check:
Unowned reference points to existing object = true [OK]
- Thinking unowned makes owner nil
- Confusing identity operator with equality
- Expecting runtime error due to unowned
class A {
unowned var b: B
init(b: B) {
self.b = b
}
}
class B {
var a: A?
}
var bInstance: B? = B()
var aInstance: A? = A(b: bInstance!)
bInstance?.a = aInstance
bInstance = nil
print(aInstance!.b)
aInstance = nilSolution
Step 1: Understand the unowned reference lifetime
The unowned referencebin class A assumesBinstance exists as long asAexists.Step 2: Analyze object deallocation order
WhenbInstanceis set to nil,Bis deallocated, butAremains alive (held byaInstance). ThusbinApoints to deallocatedB, andprint(aInstance!.b)accesses it, causing crash.Final Answer:
Unowned reference b is accessed after B is deallocated -> Option BQuick Check:
Unowned must not outlive referenced object [OK]
- Confusing unowned with weak references
- Ignoring object deallocation order
- Assuming unowned prevents crashes automatically
Teacher and Student, where each Student has an unowned reference to their Teacher, and each Teacher has a strong array of Student instances. Which of the following best explains why using unowned for the Student to Teacher reference is appropriate?Solution
Step 1: Understand the lifetime relationship
TheTeacherowns theStudentstrongly, so theTeacherwill exist as long as theStudentdoes.Step 2: Why use unowned here?
Usingunownedfor theStudenttoTeacherreference avoids a strong reference cycle becauseStudentdoes not keepTeacheralive.Final Answer:
Because the Teacher always exists as long as the Student exists, preventing strong reference cycles -> Option CQuick Check:
Unowned = guaranteed lifetime, no cycle [OK]
- Thinking unowned nils out automatically
- Assuming unowned increases lifetime
- Using unowned when referenced object may be nil
Ready to prove it?
Pass the test and this pattern moves unknown
