What is the proper way to avoid Retain Cycle while using blocks

前端 未结 4 1768
有刺的猬
有刺的猬 2020-12-05 21:16

What is the proper way to add objects in NSMutableArray which is strongly defined by property.

[tapBlockView setTapBlock:^(UIImage* image) {
   [self.myImage         


        
相关标签:
4条回答
  • 2020-12-05 21:30

    After maddy's answer - this is from 2012 WWDC lecture on GCD and asynchronous programming:

    __weak MyClass *weakSelf = self;
    
    [tapBlockView setTapBlock:^(UIImage* image) {
        __strong MyClass *strongSelf = weakSelf;
        if(strongSelf) {
            [strongSelf.myImageArray addObject:image];
        }
    }];
    
    0 讨论(0)
  • 2020-12-05 21:38

    In your case you only need to reference an array which is referenced by self, so:

    NSMutableArray *array = self.myImageArray;
    [tapBlockView setTapBlock:^(UIImage* image)
                              {
                                 [array addObject:image]; // No cycle
                              }];
    

    Works fine provided that self.myImageArray does not return different array references at different times. There is no cycle: the current object references the array and the block, and in turn the block references the array.

    If self.myImageArray does return different array references as different times then use a weak reference to self, your case 3.

    0 讨论(0)
  • 2020-12-05 21:46

    Try a combination of the 2nd and 3rd.

    __weak id weakSelf = self;
    [tapBlockView setTapBlock:^(UIImage* image) {
        [weakSelf.myImageArray addObject:image];
    }
    
    0 讨论(0)
  • 2020-12-05 21:51

    Your second and third ones appear correct. The second one works because you did not create a copy of the array, so that still points to the original one. The third one works because the reference to self is weak.

    0 讨论(0)
提交回复
热议问题