7

GitHubのREActivityViewControllerプロジェクトに奇数行のコードがあり、それを理解できません。それは、それが宣言されている正確なクラスに値をキャストしないように見えますが、なぜそれが必要なのかわかりません。私はそれが相続にとって何らかの重要性を持っているのだろうかと思います。__typeofを使用した弱い自己割り当ての説明

これがなぜ行われるのか誰にも説明できますか?

__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

__typeof(self)は、特定のクラスにバインドされていないため、移植性に優れています。でも、&*のトリックは間違いなく似ています。私の知る限りでは、Cにあり、結果としてObjective-Cにあります。&*ptrは、完全にptrに相当します。

しかし、C++などの他のC言語のような言語では、演算子がオーバーロードされ、セマンティックが見た目ほど単純でない可能性があるため、これは当てはまりません。実際には、特にC++アプリケーションには、すでにイテレータを扱っているときには、&*が既に見ています。私の推測では、著者はC++という背景を持っているので、彼はその冗長構造を挿入したのです。

とにかく、私は間違っているかもしれませんし、より洗練された説明を聞いてみたいと思います。

+0

ガブリエル、それは合理的な説明のようです。私はいくつかの文脈を得るためにこのようなGoogleの構文ができたらいいと思う。 – Brennan

0

Objective-Cメソッドのself型は常にポインタ型なので、Objective-C++でも__typeof(& * self)は冗長です。 __typeof(self)は常に動作するはずです。

+0

もう1つのオプションは、Objective-Cの最近のバージョンでサポートされているautoキーワードを使用することです: 'auto __weak weakSelf = self;' –

関連する問題