Question de mémoire...

Hello à  tous !


 


J'ai une petite question sur une implémentation. Ca m'énerve un peu car je pensais avoir compris ce genre de choses mais apparement non :


 


Quelle est la différence entre :



#import "MaSuperClasse.h"

@interface MaSuperClasse ()<UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>

@property (weak, nonatomic) UIView *maSuperVue;

@end

@implementation MaSuperClasse

#pragma mark - Life Cycle && Initialize

- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self initialize];
}
return self;
}

- (void)initialize
{

UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
view.backgroundColor=[UIColor whiteColor];
[self addSubview:view];
_maSuperVue=view;

}


et



#import "MaSuperClasse.h"

@interface MaSuperClasse ()<UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout>

@property (weak, nonatomic) UIView *maSuperVue;

@end

@implementation MaSuperClasse

#pragma mark - Life Cycle && Initialize

- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
[self initialize];
}
return self;
}

- (void)initialize
{

_maSuperVue = [[UIView alloc] initWithFrame:CGRectZero];
_maSuperVue.backgroundColor=[UIColor whiteColor];
[self addSubview:_maSuperVue];

}


Est-ce que la différence vient que j'initialise un objet localement dans la classe et que du coup il sera retenu tant que l'instance de la classe vie, alors que dans le deuxième cas j'ai spécifié qu'il était weak et donc il sera désalloué à  la fin de la méthode initialize.


Dans ce cas, au lieu de faire le tour de passe passe du premier cas, ne vaut-il pas mieux mettre un strong à  la property ?


 


Merci pour vos explications ;)


Réponses



  • Est-ce que la différence vient que j'initialise un objet localement dans la classe et que du coup il sera retenu tant que l'instance de la classe vie




     


    Clairement pas.


     


    Comment je comprends ton cas :


    1) une variable locale est toujours __strong


    2) sa "portée de vie" est, je pense, relative à  la méthode où elle est utilisée (et pas à  l'instance de l'objet)


    => du coup, ton objet vers lequel point `view` va rester "en vie" jusqu'au bout de ta méthode `initialize`. Ensuite, au cours de cette méthode, il est retain par un autre objet (`self`ici), donc `view` sera "en vie" tant que `self` l'ait ou que `self` le release.

  • ok, merci pour l'explication !


     


    Parce que dans ce cas là  :



    _maSuperVue = [[UIView alloc] initWithFrame:CGRectZero];
    _maSuperVue.backgroundColor=[UIColor whiteColor];
    [self addSubview:_maSuperVue];

    le compilateur me met un warning comme quoi l'objet sera desalloué à  la fin de la méthode... ( le warning n'apparait pas dans la première méthode)


    Pourtant il me semble qu'il est retain par self ici ?


  • Il est retain à  la ligne 3 mais on pourrait imaginer que des la ligne 2 il est desalloué puisque personne ne le retain. D'ou le warning.
  • CéroceCéroce Membre, Modérateur



    _maSuperVue = [[UIView alloc] initWithFrame:CGRectZero];
    _maSuperVue.backgroundColor=[UIColor whiteColor];
    [self addSubview:_maSuperVue];

    le compilateur me met un warning comme quoi l'objet sera desalloué à  la fin de la méthode... (




     


    Tu as déclaré maSuperVue en weak. En pratique, une vue retient ses enfants, donc addSubview: va retenir maSuperVue, mais si tu appelles [self removeFromSuperview], maSuperVue ne sera plus retenue.


     


    Déclare plutôt, maSuperVue en strong; en effet, on s'attend à  ce qu'elle reste en mémoire.

Connectez-vous ou Inscrivez-vous pour répondre.