Weak references in blocks and retain cycles

后端 未结 2 838
野性不改
野性不改 2021-01-13 09:25

In this question, I asked about the following code and retain cycles:

__weak Cell *weakSelf = self;
NSBlockOperation *op = [NSBlockOperation blockOperationWi         


        
2条回答
  •  既然无缘
    2021-01-13 09:47

    Your old code creates this retain cycle if you don't use __weak:

    • (NSBlockOperation *)op retains the outer block
    • The outer block retains self (if you're not using __weak)
    • self retains (NSOperationQueue *)renderQueue
    • (NSOperationQueue *)renderQueue retains (NSBlockOperation *)op

    None of the objects in that cycle can be deallocated unless one of those links is broken. But the code you showed us does break the retain cycle. When op finishes executing, renderQueue releases it, breaking the retain cycle.

    I suspect that your new code creates this retain cycle:

    • (MBItem *)close retains the block
    • The block retains self
    • self retains childObject
    • childObject retains (NSMutableArray *)items
    • (NSMutableArray *)items retains (MBItem *)close

    If nothing happens to break one of those links, none of the objects in the cycle can be deallocated. You haven't shown us any code that breaks the retain cycle. If there is no event that explicitly breaks it (for example by clearing out childObject.items), then you need to use __weak to break the retain cycle.

提交回复
热议问题