我目前正在考虑如何在使用保留self的块时防止强引用循环。通常的方法似乎只是使用一个弱的自我参考:
@property (strong, nonatomic) NSOperationQueue *queue;
- (void)methodA {
__weak id *weakSelf = self;
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
[weakSelf methodB];
}];
[self.queue addOperation:operation];
}
但是如果方法B看起来像这样呢:
- (void)methodB {
[self someOtherMethod];
}
这还会引起强烈的参考周期吗?或者,方法B会从方法A接收到对self的弱引用作为其对自身的引用吗?(也就是说,方法B对self的引用只是对方法a的弱引用的强引用吗?)
或者方法B会从方法A接收到对self的弱引用吗它指的是自我?(也就是说,methodB对self的引用只是一个对方法A中的弱引用的强引用?)
方法不会"接收"强引用或弱引用。它收到一个参考。"强"或"弱"仅适用于变量(通常是实例变量或块捕获的变量)。
CCD_ 1是块中的弱参考。因为weakSelf
是归零弱引用(__weak
),所以它要么指向有效对象,要么其值为nil
。如果是前者,它指向一个有效的对象,并对其调用methodB
。如果是后者,则向nil
发送消息没有任何作用,因此不会发生任何事情。
您询问methodB
中的self
是否是一个强有力的参考。强引用意味着它被保留,因此如果self
是weakSelf
0中的强引用,则意味着它在方法开始时保留self
,并在结束时释放它。但是,为什么该方法是否保留诸如self
之类的参数很重要呢?保留周期指的是相互强烈引用的对象。函数或方法将运行,然后停止;根据内存管理规则,他们对局部变量所做的任何保留都必须是临时的,并且对保留周期没有影响。(技术上的答案是否定的,self
没有保留在ARC中,包括self
在内的论点通常不会保留在MRC中。但正如我所说,这真的不相关。)
我终于在文档中找到了一个部分来回答这个问题。因此,看起来方法B确实接收到了块对self的弱引用。