弱自我和强自我在目标-C



如果块内部有很多对weakSelf的引用,建议创建其强版本。代码如下所示:

__weak typeof(self) weakSelf = self;
self.theBlock = ^{
__strong typeof(self) strongSelf = weakSelf;
[strongSelf doSomething];
[strongSelf doSomethingElse];
};

我关心的是上面代码中的这一行:

__strong typeof(self) strongSelf = weakSelf;

我们写typeof(self)不是错吗?这里允许引用self吗?

在教程中,他们有时会写:

__strong typeof(weakSelf) strongSelf = weakSelf;

两个版本都使用 50/50。两者都正确吗?

当我们写typeof(self(时,这不是错误的吗?这里允许引用自我吗?

(A( 否。(B( 是

typeof是一个(Objective-(C语言扩展,在声明中(这里你声明strongSelf(由编译器作为编译时处理 - 在生成的编译代码中没有使用typeoftypeof的主要用途是#define宏,它使单个宏能够扩展为处理不同类型的宏;同样,这种宏扩展发生在编译时。

在您的情况下,您正在实例方法中构造一个块,抽象地说,您的代码将如下所示:

@implementation SomeClass {
- (someReturnType) someInstanceMethod {
... ^{ typeof(self) strongSelf = weakself; ... } ...
} }

在这里,typeof(self)实际上只是SomeClass的"速记"。self的使用在编译时处理,并且不会捕获对self引用的运行时对象的引用。

两个版本都使用 50/50。两者都正确吗?

两者在含义上是相同的。ARC 的规则规定,如果不存在限定符,则假定__strong,因此一个版本依赖于此版本,另一个版本使限定符显式。

呵呵

最新更新