Вызывает ли вызов метода внутри блока, который вызывает другой метод, ссылающийся на себя, цикл сохранения?
Можно 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)
,
Нет не будет Потому что это просто указывает на метод, который не будет содержать что-то внутри методов, которые просто ссылаются как объект.