3 votes

valeur renvoyée par la méthode de la classe objective c, affectée aux propriétés faibles/fortes

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X