Объяснение слабого самостоятельного назначения с использованием __typeof

Я нашел странную строку кода в проекте REActivityViewController на GitHub и не могу этого понять. Похоже, что оно не приводит к точному приведению значения к классу, в котором оно объявлено, но я не знаю, зачем это нужно. Интересно, так ли это важно для наследования?

Кто-нибудь может объяснить, почему это будет сделано?

__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 в пределах блока. Когда он выходит из области видимости, он безопасно отбрасывает сильную ссылку.

7

Решение

__typeof(self) хорош для мобильности, так как он не привязан к определенному классу, тем не менее &* трюк выглядит определенно излишним. Насколько мне известно, в C, и следовательно Objective-C, &*ptr полностью эквивалентно ptr,

Тем не менее, это не может иметь место в других C-подобных языках, таких как C++, поскольку операторы могут быть перегружены, а семантика может быть не такой простой, как кажется. На самом деле я видел это &* уже в C++ приложения, особенно при работе с итераторами. Я предполагаю, что автор имеет C++ фон, и именно поэтому он вставил эту избыточную конструкцию.

В любом случае, я могу ошибаться и хотел бы услышать более изощренное объяснение, оно есть.

4

Другие решения

Поскольку тип self в методе Objective-C всегда является типом указателя, __typeof (&* self) является избыточным даже в Objective-C ++. __typeof (self) всегда должен работать.

0