Bird
Raised Fist0
Swiftprogramming~5 mins

Memory implications of captures in Swift - Cheat Sheet & Quick Revision

Choose your learning style10 modes available
Recall & Review
beginner
What is a closure capture in Swift?
A closure capture happens when a closure uses variables or constants from its surrounding context, keeping a reference to them even after the original scope ends.
Click to reveal answer
intermediate
Why can capturing self strongly inside a closure cause memory leaks?
Because the closure keeps a strong reference to self, and if self also holds a reference to the closure, they keep each other alive, causing a retain cycle and memory leak.
Click to reveal answer
intermediate
What is a weak capture in Swift closures?
A weak capture means the closure holds a weak reference to the captured variable, so it does not increase its reference count and helps avoid retain cycles.
Click to reveal answer
beginner
How do you declare a weak capture of self in a Swift closure?
Use a capture list like [weak self] before the closure body, for example: { [weak self] in ... }
Click to reveal answer
advanced
What happens if you use [unowned self] in a closure and self is nil when accessed?
Using [unowned self] means the closure assumes self will never be nil. If self is nil when accessed, the program will crash with a runtime error.
Click to reveal answer
What does a strong capture inside a closure do to the captured variable's reference count?
ADecreases the reference count
BSets the reference count to zero
CDoes not affect the reference count
DIncreases the reference count
Which capture type helps prevent retain cycles by not increasing reference count?
AStrong
BUnowned
CWeak
DStatic
What keyword is used in Swift to declare a weak capture in a closure?
Aweak
Bunowned
Cstatic
Dstrong
What risk comes with using [unowned self] in a closure?
ARuntime crash if self is nil
BMemory leak
CSlower performance
DNo risk at all
Why should you be careful capturing self strongly in closures inside classes?
AIt makes the code slower
BIt can cause retain cycles and memory leaks
CIt causes syntax errors
DIt prevents the closure from running
Explain what a retain cycle is and how closure captures can cause it in Swift.
Think about two objects holding strong references to each other.
You got /4 concepts.
    Describe the difference between weak and unowned captures in Swift closures and when to use each.
    Consider safety and lifetime of the captured variable.
    You got /4 concepts.

      Practice

      (1/5)
      1. What happens when a Swift closure captures a variable strongly by default?
      easy
      A. The closure keeps a strong reference, potentially causing memory leaks if not handled.
      B. The variable is copied and changes inside the closure do not affect the original.
      C. The closure does not keep any reference to the variable.
      D. The variable is automatically released when the closure is created.

      Solution

      1. Step 1: Understand default capture behavior

        By default, Swift closures capture variables strongly, meaning they keep a reference to the original variable.
      2. Step 2: Recognize memory implications

        If the closure and the captured variable reference each other, it can cause a retain cycle, leading to memory leaks.
      3. Final Answer:

        The closure keeps a strong reference, potentially causing memory leaks if not handled. -> Option A
      4. Quick Check:

        Strong capture = possible memory leak [OK]
      Hint: Strong capture keeps variables alive, watch for retain cycles [OK]
      Common Mistakes:
      • Thinking variables are copied by default
      • Assuming closures do not hold references
      • Believing variables auto-release on capture
      2. Which syntax correctly declares a capture list to weakly capture a variable self in a Swift closure?
      easy
      A. { (weak self) in print(self) }
      B. { self weak in print(self) }
      C. { weak self -> Void in print(self) }
      D. { [weak self] in print(self) }

      Solution

      1. Step 1: Recall capture list syntax

        Capture lists are declared inside square brackets before the closure parameters, e.g., [weak self].
      2. Step 2: Match correct syntax

        { [weak self] in print(self) } uses the correct syntax: { [weak self] in ... }.
      3. Final Answer:

        { [weak self] in print(self) } -> Option D
      4. Quick Check:

        Capture list uses square brackets [weak self] [OK]
      Hint: Capture lists use square brackets before closure parameters [OK]
      Common Mistakes:
      • Using parentheses instead of square brackets
      • Placing 'weak' outside capture list
      • Incorrect arrow syntax in capture list
      3. What will be printed by the following Swift code?
      class Person {
          var name = "Alice"
          lazy var greet: () -> Void = { [unowned self] in
              print("Hello, \(self.name)!")
          }
      }
      let p = Person()
      p.greet()
      medium
      A. Hello, !
      B. Hello, Optional("Alice")!
      C. Hello, Alice!
      D. Runtime error due to unowned reference

      Solution

      1. Step 1: Analyze closure capture

        The closure captures self as unowned, meaning it expects self to always exist when called.
      2. Step 2: Check code execution

        Instance p is created, greet closure is called, printing "Hello, Alice!" using self.name.
      3. Final Answer:

        Hello, Alice! -> Option C
      4. Quick Check:

        Unowned capture prints value safely if object exists [OK]
      Hint: Unowned captures assume object exists, no optional needed [OK]
      Common Mistakes:
      • Expecting Optional wrapping in output
      • Thinking unowned causes runtime error immediately
      • Assuming empty string prints
      4. Identify the problem in this Swift code snippet and how to fix it:
      class ViewController {
          var title = "Main"
          lazy var printTitle = {
              print(self.title)
          }
      }
      let vc = ViewController()
      vc.printTitle()
      medium
      A. No problem, code runs fine and prints "Main".
      B. Retain cycle due to strong self capture; fix with [weak self] capture list.
      C. Syntax error: missing capture list brackets.
      D. Runtime error: self is nil inside closure.

      Solution

      1. Step 1: Identify capture type

        The closure captures self strongly by default, which can cause retain cycles if ViewController holds the closure.
      2. Step 2: Fix with weak capture

        Adding [weak self] in the capture list prevents retain cycle by capturing self weakly.
      3. Final Answer:

        Retain cycle due to strong self capture; fix with [weak self] capture list. -> Option B
      4. Quick Check:

        Strong capture in closures can cause retain cycles [OK]
      Hint: Use [weak self] to avoid retain cycles in closures [OK]
      Common Mistakes:
      • Ignoring retain cycles in lazy properties
      • Assuming no capture means no memory issues
      • Confusing syntax errors with memory issues
      5. You have a Swift class with a closure property that captures a variable data. You want to ensure the closure does not keep data alive if the class instance is deallocated, but still access data safely inside the closure. Which capture strategy should you use?
      hard
      A. Capture data weakly and unwrap it safely inside the closure.
      B. Capture data unowned without checks inside the closure.
      C. Capture data strongly to keep it alive as long as the closure exists.
      D. Do not capture data at all; pass it as a parameter instead.

      Solution

      1. Step 1: Understand capture effects on memory

        Strong capture keeps data alive, which may cause memory leaks if the class is deallocated.
      2. Step 2: Choose safe capture method

        Weak capture allows data to be nil if deallocated; unwrapping safely avoids crashes.
      3. Step 3: Compare with unowned and no capture

        Unowned assumes data always exists, risking crashes. Not capturing requires passing data every time, which may be inconvenient.
      4. Final Answer:

        Capture data weakly and unwrap it safely inside the closure. -> Option A
      5. Quick Check:

        Weak capture + safe unwrap = safe memory handling [OK]
      Hint: Use weak capture and optional unwrap for safe memory use [OK]
      Common Mistakes:
      • Using unowned and risking runtime crashes
      • Strong capture causing retain cycles
      • Ignoring safe unwrapping of weak references
      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