Bird
Raised Fist0
Swiftprogramming~10 mins

Unowned references for guaranteed lifetime in Swift - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to declare an unowned reference to avoid retain cycles.

Swift
class Person {
    var name: String
    init(name: String) {
        self.name = name
    }
}

class Apartment {
    unowned var tenant: [1]
    init(tenant: Person) {
        self.tenant = tenant
    }
}
Drag options to blanks, or click blank then click option'
AString
BApartment
CInt
DPerson
Attempts:
3 left
💡 Hint
Common Mistakes
Using a value type like String or Int for unowned reference.
Using the wrong class name for the unowned property.
2fill in blank
medium

Complete the code to declare an unowned reference correctly.

Swift
class Customer {
    var name: String
    init(name: String) {
        self.name = name
    }
}

class CreditCard {
    unowned [1] customer: Customer
    init(customer: Customer) {
        self.customer = customer
    }
}
Drag options to blanks, or click blank then click option'
Avar
Bunowned
Clet
Dweak
Attempts:
3 left
💡 Hint
Common Mistakes
Using var instead of let for unowned reference.
Confusing weak and unowned references.
3fill in blank
hard

Fix the error in the code by choosing the correct keyword for the reference to avoid a runtime crash.

Swift
class Owner {
    var name: String
    init(name: String) {
        self.name = name
    }
}

class House {
    [1] var owner: Owner?
    init(owner: Owner) {
        self.owner = owner
    }
}
Drag options to blanks, or click blank then click option'
Aweak
Blazy
Cunowned
Dstrong
Attempts:
3 left
💡 Hint
Common Mistakes
Using unowned for optional references that can become nil.
Using strong reference causing retain cycles.
4fill in blank
hard

Fill both blanks to create a class with an unowned reference and initialize it properly.

Swift
class Driver {
    var name: String
    init(name: String) {
        self.name = name
    }
}

class Car {
    [1] var driver: Driver
    init(driver: [2]) {
        self.driver = driver
    }
}
Drag options to blanks, or click blank then click option'
Aunowned
Bweak
CDriver
DString
Attempts:
3 left
💡 Hint
Common Mistakes
Using weak instead of unowned for guaranteed lifetime.
Using wrong type for the parameter.
5fill in blank
hard

Fill all three blanks to create a pair of classes with unowned references to avoid retain cycles.

Swift
class Teacher {
    var name: String
    init(name: String) {
        self.name = name
    }
}

class Classroom {
    [1] var teacher: Teacher
    init(teacher: [2]) {
        self.teacher = teacher
    }
    func assignTeacher() -> [3] {
        return teacher.name
    }
}
Drag options to blanks, or click blank then click option'
Aunowned
BTeacher
CString
Dweak
Attempts:
3 left
💡 Hint
Common Mistakes
Using weak instead of unowned for guaranteed lifetime.
Returning wrong type from the function.

Practice

(1/5)
1. What is the main purpose of using unowned references in Swift?
easy
A. To automatically nil out the reference when the object is deallocated
B. To create a strong reference that keeps the object alive
C. To make a copy of the referenced object
D. To refer to another object without increasing its lifetime

Solution

  1. Step 1: Understand what unowned means

    unowned references do not increase the lifetime of the object they point to.
  2. Step 2: Compare with other reference types

    Unlike strong references, unowned does not keep the object alive, and unlike weak references, it assumes the object will always exist during use.
  3. Final Answer:

    To refer to another object without increasing its lifetime -> Option D
  4. Quick Check:

    Unowned references = no lifetime increase [OK]
Hint: Unowned means no lifetime increase, but object must exist [OK]
Common Mistakes:
  • Confusing unowned with strong references
  • Thinking unowned automatically nils out
  • Assuming unowned copies the object
2. Which of the following is the correct syntax to declare an unowned reference to an instance of class Person named friend?
easy
A. unowned var friend: Person
B. var friend: unowned Person
C. var friend: Person unowned
D. var unowned friend: Person

Solution

  1. Step 1: Recall Swift syntax for unowned references

    The correct syntax places unowned before the variable declaration: unowned var variableName: Type.
  2. Step 2: Match the options

    unowned var friend: Person matches this syntax exactly: unowned var friend: Person.
  3. Final Answer:

    unowned var friend: Person -> Option A
  4. Quick Check:

    Unowned keyword before var = correct syntax [OK]
Hint: Put 'unowned' before 'var' for correct syntax [OK]
Common Mistakes:
  • Placing 'unowned' after the variable name
  • Using 'var' after 'unowned' incorrectly
  • Writing 'unowned' after the type
3. Consider the following Swift code snippet:
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?
medium
A. true
B. false
C. nil
D. Runtime error

Solution

  1. 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.
  2. 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.
  3. Final Answer:

    true -> Option A
  4. Quick Check:

    Unowned reference points to existing object = true [OK]
Hint: Unowned references assume object exists, so identity check is true [OK]
Common Mistakes:
  • Thinking unowned makes owner nil
  • Confusing identity operator with equality
  • Expecting runtime error due to unowned
4. Given the code below, what is the main issue causing a runtime crash?
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 = nil
medium
A. Optional unwrapping failure
B. Unowned reference b is accessed after B is deallocated
C. Syntax error in unowned declaration
D. Strong reference cycle causing memory leak

Solution

  1. Step 1: Understand the unowned reference lifetime

    The unowned reference b in class A assumes B instance exists as long as A exists.
  2. Step 2: Analyze object deallocation order

    When bInstance is set to nil, B is deallocated, but A remains alive (held by aInstance). Thus b in A points to deallocated B, and print(aInstance!.b) accesses it, causing crash.
  3. Final Answer:

    Unowned reference b is accessed after B is deallocated -> Option B
  4. Quick Check:

    Unowned must not outlive referenced object [OK]
Hint: Unowned crashes if referenced object is gone first [OK]
Common Mistakes:
  • Confusing unowned with weak references
  • Ignoring object deallocation order
  • Assuming unowned prevents crashes automatically
5. You have two classes, 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?
hard
A. Because unowned references automatically nil out when the Teacher is deallocated
B. Because the Student might outlive the Teacher, so unowned avoids nil references
C. Because the Teacher always exists as long as the Student exists, preventing strong reference cycles
D. Because unowned references increase the lifetime of the Teacher to match the Student

Solution

  1. Step 1: Understand the lifetime relationship

    The Teacher owns the Student strongly, so the Teacher will exist as long as the Student does.
  2. Step 2: Why use unowned here?

    Using unowned for the Student to Teacher reference avoids a strong reference cycle because Student does not keep Teacher alive.
  3. Final Answer:

    Because the Teacher always exists as long as the Student exists, preventing strong reference cycles -> Option C
  4. Quick Check:

    Unowned = guaranteed lifetime, no cycle [OK]
Hint: Use unowned when referenced object lifetime is guaranteed [OK]
Common Mistakes:
  • Thinking unowned nils out automatically
  • Assuming unowned increases lifetime
  • Using unowned when referenced object may be nil
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard