【问题标题】:Explanation of weak self assignment using __typeof使用 __typeof 解释弱自赋值
【发布时间】:2013-05-06 18:53:38
【问题描述】:

我在 GitHub 上的 REActivityViewController 项目中发现了一行奇怪的代码,无法理解。它似乎避免将值转换为它被声明为的确切类,但我不知道为什么这是必要的。我想知道它是否对继承很重要。

谁能解释为什么会这样做?

__typeof(&*self) __weak weakSelf = self;

https://github.com/romaonthego/REActivityViewController/blob/master/REActivityViewController/REPocketActivity.m

我会通过这种方式声明来更清楚地说明这一点......

id __weak weakSelf = self;

然后在块内我可以将其重新声明为强引用。

REPocketActivity* __strong strongSelf = (REPocketActivity*)weakSelf;

然后我会在块内使用strongSelf。当它超出范围时,它会安全地删除强引用。

【问题讨论】:

    标签: c++ objective-c automatic-ref-counting weak-references typeof


    【解决方案1】:

    __typeof(self) 有利于可移植性,因为它没有绑定到特定的类,但&* 技巧看起来绝对是多余的。据我所知,在C 中,因此在Objective-C 中,&*ptr 完全等同于ptr

    但是,这可能不适用于其他类似 C 的语言,例如 C++,因为运算符可能会被重载,并且语义可能不像看起来那么简单。事实上,我已经在C++ 应用程序中看到了&*,尤其是在处理迭代器时。我的猜测是作者有C++ 背景,这就是他插入那个冗余结构的原因。

    无论如何,我可能是错的,我很想听听更复杂的解释,这是有的。

    【讨论】:

    • Gabriele,这似乎是一个合理的解释。我希望我能用这样的谷歌语法来获得一些上下文。
    【解决方案2】:

    由于在 Objective-C 方法中 self 的类型总是指针类型,所以 __typeof(&*self) 即使在 Objective-C++ 中也是多余的。 __typeof(self) 应该始终有效。

    【讨论】:

    • 另一种选择是使用最近版本的 Objective-C 现在支持的 auto 关键字:auto __weak weakSelf = self;
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    相关资源
    最近更新 更多