Каков правильный способ избежать сохранения цикла при использовании блоков

Каков правильный способ добавления объектов в NSMutableArray, который сильно определяется свойством.

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

Если я создам слабую ссылку, то что-то вроде

__weak NSMutableArray *array = self.myImageArray;
[tapBlockView setTapBlock:^(UIImage* image) {
    [array addObject:image]; // If I will do this then how will I update original Array ?
}

Я также пробовал

__weak id weakSelf = self;
[tapBlockView setTapBlock:^(UIImage* image) {
    [weakSelf storeImageInaNewMethod:image]; // Calling SToreImageInaNewMethod
}

и

-(void)storeImageInaNewMethod:(UIImage*)image {
   [self.myImageArray addObject:image]; // This again retaining cycle
}

Каков правильный способ обновления исходного объекта, определенного свойством?

Ответ 1

Попробуйте комбинацию 2-го и 3-го.

__weak id weakSelf = self;
[tapBlockView setTapBlock:^(UIImage* image) {
    [weakSelf.myImageArray addObject:image];
}

Ответ 2

После безумного ответа - это с 2012 года в WWDC лекция по GCD и асинхронному программированию:

__weak MyClass *weakSelf = self;

[tapBlockView setTapBlock:^(UIImage* image) {
    __strong MyClass *strongSelf = weakSelf;
    if(strongSelf) {
        [strongSelf.myImageArray addObject:image];
    }
}];

Ответ 3

В вашем случае вам нужно всего лишь ссылаться на массив, на который ссылается self, поэтому:

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

Прекрасно работает при условии, что self.myImageArray не возвращает разные ссылки массива в разное время. Нет цикла: текущий объект ссылается на массив и блок, и в свою очередь блок ссылается на массив.

Если self.myImageArray возвращает разные ссылки массива в разное время, используйте слабую ссылку на self, ваш случай 3.

Ответ 4

Ваши второй и третий отображаются правильно. Второй работает, потому что вы не создали копию массива, так что все еще указываете на исходный. Третий работает, потому что ссылка на "я" слаба.