Я нашел странную строку кода в проекте REActivityViewController на GitHub и не могу этого понять. Похоже, что оно не приводит к точному приведению значения к классу, в котором оно объявлено, но я не знаю, зачем это нужно. Интересно, так ли это важно для наследования?
Кто-нибудь может объяснить, почему это будет сделано?
__typeof(&*self) __weak weakSelf = self;
Я бы сделал это более ясным, объявив это так …
id __weak weakSelf = self;
И тогда в пределах блока я могу объявить это как сильную ссылку.
REPocketActivity* __strong strongSelf = (REPocketActivity*)weakSelf;
Тогда я бы использовал strongSelf
в пределах блока. Когда он выходит из области видимости, он безопасно отбрасывает сильную ссылку.
__typeof(self)
хорош для мобильности, так как он не привязан к определенному классу, тем не менее &*
трюк выглядит определенно излишним. Насколько мне известно, в C
, и следовательно Objective-C
, &*ptr
полностью эквивалентно ptr
,
Тем не менее, это не может иметь место в других C-подобных языках, таких как C++
, поскольку операторы могут быть перегружены, а семантика может быть не такой простой, как кажется. На самом деле я видел это &*
уже в C++
приложения, особенно при работе с итераторами. Я предполагаю, что автор имеет C++
фон, и именно поэтому он вставил эту избыточную конструкцию.
В любом случае, я могу ошибаться и хотел бы услышать более изощренное объяснение, оно есть.
Поскольку тип self в методе Objective-C всегда является типом указателя, __typeof (&* self) является избыточным даже в Objective-C ++. __typeof (self) всегда должен работать.