Вызывает ли вызов метода внутри блока, который вызывает другой метод, ссылающийся на себя, цикл сохранения?

Можно doFirst вызвать цикл сохранения здесь?

@interface Example : NSObject
@property (nonatomic, strong) void (^block)();
@end

@implementation Example

- (void)doFirst
{
    __weak id weakSelf = self;
    self.block = ^ {            
        [weakSelf doSecond];
    };

    self.block();
}

- (void)doSecond
{
    self.value = //...
    // do other stuff involving self
}
@end

2 ответа

Решение

В отличие от блоков, методы не являются объектами; они не могут содержать постоянную ссылку на объекты.

Ваш код не вызовет цикл сохранения. Тот факт, что код внутри doSecond Рекомендации self явно не означает, что self будет сохранено дополнительное время. Когда ваш блок звонит doSecond, его self исходит от weakSelf ссылка внутри doFirst,

Примечание. Когда вы сохраняете блоки как свойства, используйте(nonatomic, copy) вместо (nonatomic, strong),

Нет не будет Потому что это просто указывает на метод, который не будет содержать что-то внутри методов, которые просто ссылаются как объект.

Другие вопросы по тегам