29

这用于Objective-C的弱化模式

我的猜测是这意味着:使用名称“weakSelf”和 self 类型(例如 MyViewController)为 self 分配一个弱引用

如果它是正确的并且对您来说很明显:我想绝对确保它是正确的。谢谢。

4

4 回答 4

28

我的猜测是这意味着:使用名称weakSelftypeof自我(例如MyViewController)为 self 分配一个弱引用

是的,这几乎就是它的意思。的类型self将是MyViewController*(带有星号) not MyViewController

使用这种语法而不是简单地编写背后的想法

MyViewController __weak *weakSelf = self;

使重构代码变得更容易。的使用typeof还可以定义可以粘贴到代码中任何位置的代码片段。

于 2014-05-19T16:27:12.243 回答
11

使用@weakify@strongify来自libExtObjC有助于简化有时必须围绕块做的“弱强舞蹈”。OP 引用了这篇文章

例子!

__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);
于 2014-05-19T16:44:34.937 回答
5

你的解释是正确的。但是,我发现以这种方式编写时,阅读起来会有些混乱。我更喜欢它后面有一个额外的空间typeof(self)

__weak typeof(self) weakSelf = self;
于 2014-05-19T16:29:29.043 回答
4

根据您的编译器设置,您可能会收到警告“Expected ';' 表达后”。您可以通过将其更改为使用 __typeof 来解决此问题,如下所示:__typeof(self) __weak weakSelf = self;

感谢 Leo Natan 和这个问题:https ://stackoverflow.com/a/32145709/1758224 。

于 2016-06-28T19:50:50.837 回答