如果块内部有很多对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
(由编译器作为编译时处理 - 在生成的编译代码中没有使用typeof
。typeof
的主要用途是#define
宏,它使单个宏能够扩展为处理不同类型的宏;同样,这种宏扩展发生在编译时。
在您的情况下,您正在实例方法中构造一个块,抽象地说,您的代码将如下所示:
@implementation SomeClass {
- (someReturnType) someInstanceMethod {
... ^{ typeof(self) strongSelf = weakself; ... } ...
} }
在这里,typeof(self)
实际上只是SomeClass
的"速记"。self
的使用在编译时处理,并且不会捕获对self
引用的运行时对象的引用。
两个版本都使用 50/50。两者都正确吗?
两者在含义上是相同的。ARC 的规则规定,如果不存在限定符,则假定__strong
,因此一个版本依赖于此版本,另一个版本使限定符显式。
呵呵