我正在考虑在使用保留self的块时如何防止强引用周期。通常的方法似乎只是使用弱自我引用:
@property (strong, nonatomic) NSOperationQueue *queue;
- (void)methodA {
__weak id *weakSelf = self;
NSBlockOperation *operation = [NSBlockOperation blockOperationWithBlock:^{
[weakSelf methodB];
}];
[self.queue addOperation:operation];
}
但是如果methodB看起来像这样:
- (void)methodB {
[self someOtherMethod];
}
这仍会导致强大的参考周期吗?或者,methodB会从methodA接收对self的弱引用作为对self的引用? (也就是说,methodB对self的引用只是对methodA的弱引用的强引用?)
答案 0 :(得分:1)
或者methodB会从methodA接收对self的弱引用 它对自我的提及? (也就是说,methodB对自我的引用只是一个 强烈提及方法A的弱引用?)
方法不会“接收”强引用或弱引用。它收到一个参考。 “强”或“弱”仅适用于变量(通常是由块捕获的实例变量或变量)。
weakSelf
是块中的弱引用。由于weakSelf
是归零弱引用(__weak
),因此它指向有效对象,或者其值为nil
。如果是前者,则指向有效对象,并在其上调用methodB
。如果是后者,向nil
发送消息什么都不做,所以没有任何反应。
您询问self
中的methodB
是否是强引用。强引用意味着它会被保留,因此如果self
中methodB
是强引用,则意味着它会在方法开头保留self
并在结束时释放它。但是为什么该方法是否保留self
之类的参数呢?保留周期是指对象强烈引用彼此。一个函数或方法将运行然后停止;他们对局部变量所做的任何保留必须是内存管理规则的临时保留,并且对保留周期没有影响。 (技术答案是否定的,self
不会保留在ARC中,包括self
在内的参数通常不会保留在MRC中。但正如我所说,这实际上并不相关。)
答案 1 :(得分:-1)
我终于找到了part in the documentation that kind of answers this question。所以看起来它看起来像是方法B接收了块对self的弱引用。