[swift] weak var vs. weak self

In Swift, both weak var and weak self are used to avoid creating strong reference cycles, also known as retain cycles, which can lead to memory leaks.

weak var

The weak var keyword is used to declare a weak reference to an object that is not owned. This is commonly used when dealing with optional references, such as in delegate patterns or when capturing self within closures.

Example:

weak var delegate: MyDelegate?

In this example, the weak var keyword ensures that the delegate is not keeping a strong reference to the object it points to. If the referenced object is deallocated, the delegate will automatically be set to nil.

weak self

On the other hand, weak self is used within closure capture lists to prevent strong reference cycles when capturing self inside a closure. This is commonly used when dealing with asynchronous operations, such as network requests or animations.

Example:

someAsynchronousOperation { [weak self] in
    self?.doSomething()
}

In this example, [weak self] captures self weakly within the closure, preventing a strong reference cycle.

Key Differences

In summary, weak var is used to declare weak references to objects, while weak self is used to capture self weakly within closures, preventing strong reference cycles in both cases.

For more information, you can refer to the “The Swift Programming Language” guide.