【发布时间】:2012-12-10 13:09:28
【问题描述】:
我目前正在考虑在使用保留自身的块时如何防止强引用循环。通常的方法似乎是只使用对 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的弱引用的强引用吗?)
【问题讨论】:
-
在只使用一个对象的情况下,这是一个如何引用循环?
-
我的理解是这样的:如果block有一个对self的强引用而不是弱引用,那么self引用的对象就不能被释放,因为block会持有对它的引用。另一方面,该块无法被释放,因为它被 self 引用(通过队列)。问题是,即使块的引用很弱,具有对 self 的语法强引用的 methodB 是否会重新引入这个循环。
-
你可能是对的,但不是
freed,而是released(保留计数--)所以当块终止时,对象将被销毁,所以它会可能没问题。 -
我猜你可以说释放而不是释放。我的意思是在保留计数达到零后从内存中删除对象。
-
@trojanfoe 让我们假设队列被挂起并且所有对对象的强引用(由 self 引用)但块内的那些被删除。
标签: objective-c objective-c-blocks cycle self strong-references