7

我在 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在块内使用。当它超出范围时,它会安全地删除强引用。

4

2 回答 2

4

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

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

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

于 2013-05-12T17:50:54.957 回答
0

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

于 2013-10-15T15:51:51.323 回答