Le code est un exemple. Je ne sais pas si ma compréhension est correcte.
[self.view mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.equalTo(self.otherView.mas_centerY);
}];
Le bloc contient self, mais self.view ne contient pas ce bloc, car le code source de Masonry est le suivant :
- (NSArray *)mas_makeConstraints:(void(^)(MASConstraintMaker *))block {
self.translatesAutoresizingMaskIntoConstraints = NO;
MASConstraintMaker *constraintMaker = [[MASConstraintMaker alloc] initWithView:self];
block(constraintMaker);
return [constraintMaker install];
}
C'est juste un bloc (constrainMaker). S'il est remplacé par self.block = block(constrainMaker), la vue contient-elle également le bloc
?
Il n'est pas vrai que le bloc provoquera certainement une référence circulaire. Le fait qu'il s'agisse d'une référence circulaire dépend du fait qu'ils contiennent de fortes références les uns aux autres. Si self est utilisé dans un bloc, le bloc gardera une référence à self, mais self ne détient pas le bloc directement ou indirectement, donc il ne provoquera pas de référence circulaire.
Votre compréhension est correcte.