跳到主要内容

简述__weak 为 属性修饰的变量,如何实现在变量没有强引用后自动置为 nil ?

参考答案:

__weak 是 Objective-C 和 Swift 中的一个属性修饰符,它用于声明一个弱引用(weak reference)。在 ARC(Automatic Reference Counting,自动引用计数)环境下,弱引用不会增加对象的引用计数。因此,当对象没有其他的强引用(strong reference)时,它会被自动释放,而弱引用也会被自动置为 nil

Objective-C 中的 __weak

在 Objective-C 中,你可以使用 __weak 修饰符来声明一个弱引用。这通常在避免循环引用时非常有用,例如,在代理(delegate)模式或 block 中。

示例:

__weak typeof(self) weakSelf = self;
[self someAsyncOperationWithCompletion:^{
    // 在这里使用 weakSelf 而不是 self,以避免循环引用
    if (weakSelf) {
        // 访问 weakSelf 的属性或方法
    }
}];

在这个例子中,weakSelf 是一个对 self 的弱引用。当 self 没有其他的强引用时,它会被释放,而 weakSelf 会自动变为 nil。在 block 内部检查 weakSelf 是否为 nil 是一个好的做法,以确保在访问其属性或方法之前,weakSelf 所指向的对象没有被释放。

Swift 中的 weak

在 Swift 中,弱引用的概念与 Objective-C 中的 __weak 类似,但语法稍有不同。在 Swift 中,你使用 weak 关键字来声明一个弱引用。

示例:

class MyClass {
    weak var delegate: MyDelegate?
    
    func doSomething() {
        // ... 执行一些操作 ...
        
        delegate?.someMethod() // 弱引用,避免循环引用
    }
}

在这个 Swift 示例中,delegate 是一个弱引用,它指向一个实现了 MyDelegate 协议的对象。当没有其他的强引用指向这个对象时,它会被释放,而 delegate 会自动变为 nil。在调用 delegate?.someMethod() 时,如果 delegatenil,则不会执行任何操作,从而避免了访问已经被释放的对象。