“__weak typeof(self)weakSelf = self;” 的确切含义是什么?

30
这是在Objective-C的weakify模式中使用的。我的猜测是:用名称“weakSelf”和self的类型(例如MyViewController)分配一个弱引用给self。如果我猜对了,而且这对你来说很显然:我想要绝对确认正确性。谢谢。

@CrimsonChris 不错,但是必须包含 libextobjc/EXTScope,它不是 LLDB 的一部分。请参见:weakify - zaph
2
Weakify和Strongify只是包装了所有的typeof糊涂,并抑制了一些关于阴影自身的编译器警告。它们都是相同的,但有一些更多的技巧使其可读性更强。 - CodaFi
链接已失效。 - Richard Topchii
已删除失效链接。 - brainray
4个回答

29

我的猜测是:将一个名为weakSelf、类型为self (例如MyViewController)的弱引用赋给自身。

是的,几乎就是这个意思。类型为self 的正确写法应该是 MyViewController*(加了一个星号),而不是 MyViewController

使用这种语法的想法是为了避免简单地写成:

MyViewController __weak *weakSelf = self;

使重构代码更加容易。使用typeof还可以定义一个代码片段,可粘贴到代码的任何位置。


3
应该写成 MyViewController * __weak weakSelf = self; - CommaToast

12
使用 @weakify@strongifylibExtObjC 可以简化有时需要在块周围执行的 "弱-强舞蹈"。 例子!
__weak __typeof(self) weakSelf = self;
__weak __typeof(delegate) weakDelegate = delegate;
__weak __typeof(field) weakField = field;
__weak __typeof(viewController) weakViewController = viewController;
[viewController respondToSelector:@selector(buttonPressed:) usingBlock:^(id receiver){
    __strong __typeof(weakSelf) strongSelf = weakSelf;
    __strong __typeof(weakDelegate) strongDelegate = weakDelegate;
    __strong __typeof(weakField) strongField = weakField;
    __strong __typeof(weakViewController) strongViewController = weakViewController;

对抗...

@weakify(self, delegate, field, viewController);
[viewController respondToSelector:@selector(buttonPressed:) usingBlock:^(id receiver){
    @strongify(self, delegate, field, viewController);

6
我认为你应该提到这个答案需要使用“libextobjc”。 - Logan
1
@CrimsonChris 为什么你要弱化委托?我猜它已经是弱引用了。 - Ricardo
如果我像这样创建委托... MyDelegate *delegate = [[MyDelegate alloc] init]; 直到当前方法结束,我将拥有对它的强引用。如果viewController上的属性是弱引用,那也无所谓,如果我没有将其弱化,仍然会创建一个保留循环。 - CrimsonChris

5
您的理解是正确的。然而,我发现以那种方式写出来有点令人困惑。我更喜欢在typeof(self)后面加上一个额外的空格:
__weak typeof(self) weakSelf = self;

你会如何将它移植到Swift中 - 它正在被用于我正在尝试升级的库中? - UKDataGeek
如果是用于回调块/闭包,那么代码应该是 doSomething() { [weak self] (other, parameters) in doOtherStuff() } - Zev Eisenberg

4

根据您的编译器设置,您可能会收到一个警告“表达式后应有分号”。 您可以通过像这样更改为使用__typeof来解决此问题:__typeof(self) __weak weakSelf = self;

感谢Leo Natan和这个问题:https://dev59.com/VlwY5IYBdhLWcg3w2K3c#32145709


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接