Je suis confronté à une certaine confusion concernant les propriétés faibles et fortes. Pour des raisons de brièveté, je ne vais pas inclure le code entier.
J'ai créé une méthode de commodité de classe qui renvoie un objet UIView, et je l'ai implémentée dans une catégorie UIView comme une alternative à la sous-classification.
@implementation UIView (CSMonthView)
+ (UIView *)monthViewFromDateArray:(NSArray *)arrayOfAllShiftsAndEvents withNibOwner:(id)owner selectedDate:(NSDate *)selectedDate withCompletionHandler:(void(^)(CSCalendarButton *selectedButton))block
{ // .. do some stuff
// Create an instance of UIView
UIView *monthView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320.0, 200.0)];
// Create UIButtons and set the passed down 'owner' value, as the target for an
// action event.
// Add UIButton as subviews to monthView....
return monthView;
}
Je dois noter qu'à l'intérieur de la méthode, je n'ai rien qui pointe vers monthView.
Maintenant, dans l'implémentation du "propriétaire", qui est une classe appelée CSCalendarViewController, je crée l'UIView ci-dessus en appelant la méthode de commodité de la classe et je l'assigne à une propriété UIView appelée _monthView.
@interface CSCalendarViewController : UIViewController
@property (weak, nonatomic) UIView *monthView;
@end
@implementation CSCalendarViewController
__weak CSCalendarViewController *capturedSelf = self;
// Create the current month buttons and populate with values.
_monthView = [UIView monthViewFromDateArray:_arrayOfAllShiftsAndEvents withNibOwner:self selectedDate:_selectedDate withCompletionHandler:^(CSCalendarButton *selectedButton) {
capturedSelf.selectedButton = selectedButton;
[capturedSelf.selectedButton setSelected:YES];
}
Ma confusion est la suivante. Même si j'ai défini la propriété 'monthView' comme faible, 'monthView' conserve la valeur de la UIView renvoyée.
Si je vais de l'avant et fais quelque chose comme ça :
_monthView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 200.0)];
Le compilateur émet un avertissement (comme il se doit) disant "Assigned retained object to weak variable".
Pourquoi n'ai-je pas le même message d'erreur lorsque j'assigne 'monthView' à l'UIView qui retourne la méthode de la classe ?
Je n'ai pas une connaissance approfondie de la gestion de la mémoire des systèmes pré-ARC, et je pense que je rate quelque chose d'évident. Merci.