Bird
Raised Fist0
Swiftprogramming~5 mins

Weak self and unowned self patterns in Swift - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is the purpose of using weak self in Swift closures?

Using weak self prevents strong reference cycles by creating a weak reference to self inside a closure. This means the closure does not keep self alive, avoiding memory leaks.

Click to reveal answer
intermediate
How does unowned self differ from weak self in Swift?

unowned self is a non-optional reference that assumes self will always exist when the closure runs. Unlike weak self, it does not become nil. Use it when self is guaranteed to outlive the closure.

Click to reveal answer
beginner
What happens if you access self inside a closure without weak or unowned?

Accessing self strongly inside a closure creates a strong reference cycle if self also holds the closure. This causes a memory leak because neither can be released.

Click to reveal answer
intermediate
When should you use weak self instead of unowned self?

Use weak self when self might become nil before the closure finishes. This makes self optional inside the closure, so you must safely unwrap it.

Click to reveal answer
beginner
Explain a real-life analogy for weak and unowned references.

Imagine self is a person and the closure is a friend holding a photo. weak means the friend holds a photo that can fade (become nil) if the person leaves. unowned means the friend holds a photo that never fades because the person is always around.

Click to reveal answer
What does weak self create inside a closure?
AA weak, optional reference to self
BA strong reference to self
CA non-optional unowned reference to self
DA copy of self
When should you use unowned self in a closure?
AWhen you want to copy self
BWhen self might be nil during closure execution
CWhen self is guaranteed to exist during closure execution
DWhen you want to create a strong reference cycle
What risk do you take when using unowned self incorrectly?
ACrash due to accessing nil reference
BMemory leak
CSlower performance
DNo risk at all
Which keyword makes self optional inside a closure?
Astrong
Bunowned
Clet
Dweak
Why do we avoid strong references to self inside closures?
ATo improve code readability
BTo prevent strong reference cycles and memory leaks
CTo make code run faster
DTo copy self
Explain the difference between weak self and unowned self in Swift closures.
Think about whether self can be nil or not during closure execution.
You got /4 concepts.
    Describe a situation where using weak self is necessary to avoid a memory leak.
    Consider when self and closure keep each other alive.
    You got /4 concepts.

      Practice

      (1/5)
      1. What is the main reason to use weak self inside a closure in Swift?
      easy
      A. To make self immutable inside the closure
      B. To guarantee self will never be nil inside the closure
      C. To prevent strong reference cycles and allow self to become nil
      D. To create a copy of self for thread safety

      Solution

      1. Step 1: Understand strong reference cycles

        Strong reference cycles happen when closures capture self strongly, causing memory leaks.
      2. Step 2: Role of weak self

        Using weak self makes the reference to self optional and allows it to become nil, breaking the cycle.
      3. Final Answer:

        To prevent strong reference cycles and allow self to become nil -> Option C
      4. Quick Check:

        Weak self avoids memory leaks = A [OK]
      Hint: Weak self means self can be nil inside closures [OK]
      Common Mistakes:
      • Thinking weak self guarantees non-nil self
      • Confusing weak with unowned self
      • Assuming weak self copies self
      2. Which of the following is the correct syntax to capture self as unowned in a Swift closure?
      easy
      A. [weak self] in
      B. [unowned self] in
      C. [self unowned] in
      D. [unowned] self in

      Solution

      1. Step 1: Recall capture list syntax

        Swift uses square brackets with capture specifiers before in in closures.
      2. Step 2: Correct unowned syntax

        The correct syntax is [unowned self] in to capture self as unowned.
      3. Final Answer:

        [unowned self] in -> Option B
      4. Quick Check:

        Unowned capture syntax = [unowned self] in [OK]
      Hint: Capture lists use square brackets with 'unowned self' [OK]
      Common Mistakes:
      • Swapping order like [self unowned]
      • Missing brackets or 'in' keyword
      • Using weak instead of unowned when asked
      3. Consider this Swift code snippet:
      class Example {
          var closure: (() -> Void)?
          func setup() {
              closure = { [weak self] in
                  print(self == nil ? "nil" : "not nil")
              }
          }
      }
      let example = Example()
      example.setup()
      example.closure?()
      
      What will be printed when example.closure?() is called?
      medium
      A. not nil
      B. Compilation error
      C. nil
      D. Runtime crash

      Solution

      1. Step 1: Analyze weak self capture

        The closure captures self weakly, so inside the closure self is optional.
      2. Step 2: Check self lifetime

        The example instance is still alive when closure?() is called, so self is not nil.
      3. Final Answer:

        not nil -> Option A
      4. Quick Check:

        Weak self is alive here = not nil [OK]
      Hint: If instance exists, weak self is not nil inside closure [OK]
      Common Mistakes:
      • Assuming weak self is always nil
      • Confusing weak self with unowned self
      • Expecting runtime crash due to optional
      4. Identify the problem in this Swift code and choose the best fix:
      class Person {
          var name = "Alice"
          lazy var greet: () -> Void = {
              print("Hello, \(self.name)!")
          }
      }
      let p = Person()
      p.greet()
      
      medium
      A. Make greet a regular function instead of closure
      B. Use [weak self] in closure to avoid strong reference cycle
      C. Use [unowned self] in closure to avoid strong reference cycle
      D. No problem; code works fine

      Solution

      1. Step 1: Detect strong reference cycle risk

        The closure captures self strongly, and greet is lazy var, so cycle possible.
      2. Step 2: Choose unowned self for non-optional self

        Since self will always exist when greet is called, unowned self is safe and avoids optional unwrapping.
      3. Final Answer:

        Use [unowned self] in closure to avoid strong reference cycle -> Option A
      4. Quick Check:

        Unowned self for guaranteed self = C [OK]
      Hint: Use unowned self if self always exists in closure [OK]
      Common Mistakes:
      • Ignoring strong reference cycles
      • Using weak self and forcing unwrap unnecessarily
      • Thinking no problem exists
      5. You have a Swift class that manages a network request with a closure callback. You want to avoid memory leaks but also avoid optional unwrapping inside the closure. Which pattern should you use and why? Choose the best explanation.
      hard
      A. Do not capture self at all to avoid any reference issues
      B. Use weak self to avoid leaks and unwrap self safely inside closure
      C. Use strong self to keep the instance alive during the closure execution
      D. Use unowned self because self will outlive the closure, avoiding optionals

      Solution

      1. Step 1: Understand lifetime of self and closure

        If self will definitely exist while closure runs, unowned self is safe and avoids optionals.
      2. Step 2: Compare weak vs unowned for this case

        weak self requires optional unwrapping, but unowned self assumes self exists, simplifying code and avoiding leaks.
      3. Final Answer:

        Use unowned self because self will outlive the closure, avoiding optionals -> Option D
      4. Quick Check:

        Unowned self for guaranteed lifetime = A [OK]
      Hint: Use unowned if self guaranteed alive, else weak [OK]
      Common Mistakes:
      • Using weak self but not unwrapping safely
      • Using strong self causing memory leaks
      • Ignoring self capture causing leaks
      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