__weak typeof(self) weakSelf = self 或 __weak MyObject *weakSelf = self?

__weak typeof(self) weakSelf = self OR __weak MyObject *weakSelf = self?

这里最好使用什么?为什么?

__weak typeof(self) weakSelf = self;

__weak MyObject *weakSelf = self;

显然,__weak id weakSelf = self; 是最不可取的,因为我们不会进行类型检查,对吗?

但是,在前两个之间...哪个是可取的,为什么?

此外,如果 clang 支持使用 typeof,是否有理由使用 __typeof 而不是 typeof?

第一种比较方便,因为不管class,代码都是一样的。您可以使用 Xcode 代码片段插入 typeof-using 代码行,减少击键次数。如果更改 class.

的名称,您的工作量也会减少

我不知道使用 typeof 版本有什么缺点,只是它可能更难理解。

If you use __typeof__ instead of typeof, your code will compile regardless of the compiler's dialect setting.

您可能知道 __typeof__() "expands" 参数的具体类型。如果参数是 self 并且 self 的具体类型是 MyObject (这是你的情况),它是完全一样的。

所以第一种形式只是另一种间接寻址,具有间接寻址的通常优点和缺点:

  • 间接形式更灵活,因为间接随变化

  • 间接形式可读性较差,因为reader必须在脑海中理解间接。

我个人更喜欢第二种形式。但更重要的是:就我个人而言,我更愿意将时间浪费在更重要的问题上。 ;-)

你会写:

__typeof__(self) copy = [self copy];

我不会。

我最近开始这样写:

__typeof(self) __weak weakSelf = self;

使用 __typeof 版本可以让您使用代码片段,因此速度更快,并且整个代码也将保持一致。

这不是常见的形式,因为大多数人将 __weak 变量限定符放在开头,但根据此处的文档:https://developer.apple.com/library/mac/releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html 变量限定符位于类型之后。

进入区块后,我使用:

__typeof(weakSelf) __strong strongSelf = weakSelf;
if (!strongSelf) return;

再次获得强引用

这两个都是代码片段,所以我实际上并没有打太多字,也不必记住确切的语法。