Bird
Raised Fist0
Swiftprogramming~5 mins

Strong reference cycles between classes in Swift - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a strong reference cycle in Swift classes?
A strong reference cycle happens when two or more class instances hold strong references to each other, so neither can be deallocated, causing a memory leak.
Click to reveal answer
beginner
Why do strong reference cycles cause memory leaks?
Because the instances keep each other alive by holding strong references, their memory is never freed even if they are no longer needed.
Click to reveal answer
intermediate
How can you break a strong reference cycle between two classes in Swift?
You can use weak or unowned references for one side of the relationship to avoid keeping a strong hold and allow deallocation.
Click to reveal answer
intermediate
What is the difference between weak and unowned references in Swift?
Weak references are optional and become nil when the instance is deallocated. Unowned references are non-optional and assume the instance will always exist during their use.
Click to reveal answer
beginner
Show a simple example of a strong reference cycle between two classes.
class Person {
  var apartment: Apartment?
}

class Apartment {
  var tenant: Person?
}

Here, Person and Apartment hold strong references to each other, causing a cycle.
Click to reveal answer
What happens when two Swift class instances hold strong references to each other?
AThey create a strong reference cycle causing a memory leak.
BThey automatically deallocate each other.
CThey become weak references.
DThey convert to value types.
Which keyword in Swift helps to avoid strong reference cycles by not increasing the reference count?
Astrong
Bstatic
Cweak
Dfinal
What is true about unowned references in Swift?
AThey are non-optional and assume the referenced instance always exists.
BThey cause strong reference cycles.
CThey increase the reference count.
DThey are optional and can become nil.
If you have a class A with a strong reference to class B, how should class B reference class A to avoid a cycle?
AWith a strong reference.
BWith a weak or unowned reference.
CWith a static reference.
DWith a global variable.
What happens to a weak reference when the instance it points to is deallocated?
AIt converts to an unowned reference.
BIt crashes the program.
CIt keeps pointing to invalid memory.
DIt becomes nil automatically.
Explain what a strong reference cycle is and why it is a problem in Swift classes.
Think about how two objects keep each other alive.
You got /3 concepts.
    Describe how to use weak and unowned references to fix strong reference cycles with examples.
    Focus on how these keywords change reference counting.
    You got /4 concepts.

      Practice

      (1/5)
      1.

      What causes a strong reference cycle between two Swift classes?

      Consider two classes holding references to each other.

      easy
      A. Neither class holds any reference to the other.
      B. One class holds a weak reference and the other a strong reference.
      C. Both classes hold strong references to each other, preventing deallocation.
      D. Both classes hold weak references to each other.

      Solution

      1. Step 1: Understand strong references

        Strong references keep objects alive by increasing their reference count.
      2. Step 2: Identify cycle condition

        If two objects hold strong references to each other, neither can be deallocated, causing a cycle.
      3. Final Answer:

        Both classes hold strong references to each other, preventing deallocation. -> Option C
      4. Quick Check:

        Strong references + mutual hold = cycle [OK]
      Hint: Strong references both ways cause cycles; use weak/unowned [OK]
      Common Mistakes:
      • Thinking weak references cause cycles
      • Assuming one strong and one weak causes cycle
      • Confusing unowned with strong references
      2.

      Which of the following is the correct way to declare a weak reference in Swift to avoid a strong reference cycle?

      class Person {
          var apartment: Apartment?
      }
      
      class Apartment {
          // What should go here?
          var tenant: ???
      }
      easy
      A. var tenant: Person
      B. weak var tenant: Person?
      C. unowned var tenant: Person
      D. var tenant: Person?

      Solution

      1. Step 1: Identify weak reference syntax

        In Swift, weak references are declared with the keyword weak and must be optional.
      2. Step 2: Apply to property

        So, weak var tenant: Person? is correct to avoid strong cycles.
      3. Final Answer:

        weak var tenant: Person? -> Option B
      4. Quick Check:

        Weak + optional = correct syntax [OK]
      Hint: Weak references must be optional and use 'weak' keyword [OK]
      Common Mistakes:
      • Declaring weak without optional type
      • Using unowned when weak is needed
      • Forgetting 'weak' keyword
      3.

      What will be the output of the following Swift code?

      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
          weak var tenant: Person?
          init(unit: String) { self.unit = unit }
          deinit { print("Apartment \(unit) is being deinitialized") }
      }
      
      var john: Person? = Person(name: "John")
      var apt: Apartment? = Apartment(unit: "4A")
      john!.apartment = apt
      apt!.tenant = john
      john = nil
      apt = nil
      medium
      A. Person John is being deinitialized Apartment 4A is being deinitialized
      B. No output, memory leak occurs
      C. Only Person John is being deinitialized
      D. Only Apartment 4A is being deinitialized

      Solution

      1. Step 1: Analyze references

        Person holds strong reference to Apartment; Apartment holds weak reference to Person.
      2. Step 2: Check deallocation

        Setting both variables to nil breaks strong references, so both objects deinit and print messages.
      3. Final Answer:

        Person John is being deinitialized Apartment 4A is being deinitialized -> Option A
      4. Quick Check:

        Weak reference avoids cycle, both deinit [OK]
      Hint: Weak reference breaks cycle; both objects deinit when nil [OK]
      Common Mistakes:
      • Expecting memory leak output
      • Thinking only one object deinitializes
      • Ignoring weak reference effect
      4.

      Identify the error in the following Swift code that causes a strong reference cycle:

      class Customer {
          let name: String
          var card: CreditCard?
          init(name: String) { self.name = name }
          deinit { print("Customer \(name) is being deinitialized") }
      }
      
      class CreditCard {
          let number: UInt64
          var customer: Customer?
          init(number: UInt64) { self.number = number }
          deinit { print("CreditCard \(number) is being deinitialized") }
      }
      
      var alice: Customer? = Customer(name: "Alice")
      var card: CreditCard? = CreditCard(number: 1234567890123456)
      alice!.card = card
      card!.customer = alice
      alice = nil
      card = nil
      medium
      A. CreditCard's customer property should be declared weak to avoid cycle.
      B. Customer's card property should be declared weak to avoid cycle.
      C. Both properties should be unowned to avoid cycle.
      D. No error; code works fine without changes.

      Solution

      1. Step 1: Identify reference types

        Both Customer.card and CreditCard.customer are strong references by default.
      2. Step 2: Find cycle cause

        Since both hold strong references, they create a cycle preventing deallocation.
      3. Step 3: Fix cycle

        Declaring CreditCard.customer as weak var customer: Customer? breaks the cycle.
      4. Final Answer:

        CreditCard's customer property should be declared weak to avoid cycle. -> Option A
      5. Quick Check:

        Weak reference breaks cycle [OK]
      Hint: Make one side weak to break cycle, usually the back reference [OK]
      Common Mistakes:
      • Making both references weak
      • Making the wrong property weak
      • Ignoring the cycle causing deallocation failure
      5.

      You have two classes, Owner and Car. The Owner has a strong reference to Car, and Car has a strong reference to Owner. You want to avoid a strong reference cycle but also ensure that Car always has an Owner during its lifetime. How should you declare the reference from Car to Owner?

      hard
      A. Declare the reference as weak var owner: Owner (non-optional)
      B. Declare the reference as unowned var owner: Owner
      C. Declare the reference as var owner: Owner (strong reference)
      D. Declare the reference as weak var owner: Owner?

      Solution

      1. Step 1: Understand ownership requirements

        Since Car must always have an Owner during its lifetime, the reference cannot be optional.
      2. Step 2: Choose reference type

        unowned references are non-optional and do not increase reference count, avoiding cycles.
      3. Step 3: Apply declaration

        Declare unowned var owner: Owner in Car to avoid cycle and ensure non-optional reference.
      4. Final Answer:

        Declare the reference as unowned var owner: Owner -> Option D
      5. Quick Check:

        Unowned + non-optional = correct for guaranteed lifetime [OK]
      Hint: Use unowned for non-optional back references to avoid cycles [OK]
      Common Mistakes:
      • Using weak with non-optional type (invalid)
      • Using strong reference causing cycle
      • Using weak optional when non-optional needed
      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