Question sur @property

paddevpaddev Membre
Bonjour,

J'ai une question sur la déclaration des objets.

Dans mon fichier .m je declare une image (par exemple)

UIimageView *imageFond=[[UIImafeView alloc) initwithFrame:.....];
imageFond.image=[UIimage imageNamed....];
[self.view addSubview:image];

Dans le .h dois je déclarer ceci:

UIimageView *imageFond;

ou rajouter:

@property(nonatomic, retain) UIimageView *imageFond;


je comprend pas bien l'interet de @property .
Dans ce cas je dois specifier dans le dealloc et viewdidUnload: imageFond=nil  ?

bref quelle est l'utilité de @property si on alloc l'image dans le fichier .m

merci

Réponses

  • iSofTomiSofTom Membre
    01:41 modifié #2
    Les property permettent juste de générer automatiquement des getters et des setters.

    Dans ton exemple c'est pas utile de déclarer une property car tu crées une variable locale, si tu veux mettre une property tu peux faire:

    self.imageFond = [[[UIImafeView alloc) initwithFrame:.....] autorelease];
    


    J'ai mis un autorelease ici car ta property est en mode retain, c'est à  dire qu'elle va faire un retain sur l'objet que tu lui passes, donc sans l'autorelease ça ferait un leak mémoire.
  • paddevpaddev Membre
    01:41 modifié #3
    je pose la question car je fais tout en code (rien avec interface builder)

    en fait si je declare un: uilabel=[uilabel alloc...]
    puis que j'utilise la syntaxe pointé , dois je declarer @property ou cela ne sert a rien

    Donc si j'ai compris on utilise @property que si on se sert de UIlabel dans un autre  fichier?

    Autre chose en utlisant @property et alloc cela fais 2 retain non?
    dois je aussi declarer UIlabel=nil dans dealloc et dans viewdidunload?

    Merci
  • paddevpaddev Membre
    01:41 modifié #4
    Voici un exemple de fichier , dites moi ce que je dois faire avec property dans ce cas la ou j'affiche une carte , j'ai mis des @property mais je sais pas si ils sont utiles... J'utilise ARC d'ou le fait qu'il n'y ai pas de release...aussi est ce que mes "nil" sont utiles dons le viewdidunload... merci pour vos conseils
    #import &lt;UIKit/UIKit.h&gt;<br />#import &lt;MapKit/MapKit.h&gt;<br />#import &quot;MonAnnotation.h&quot;<br />#import &quot;Concert.h&quot;<br /><br /><br />@interface GPS : UIViewController&lt;MKMapViewDelegate&gt; {<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; MKMapView *maMapView;<br />&nbsp; &nbsp; UIButton *getDirections;<br />&nbsp; &nbsp; MonAnnotation *marker;<br />&nbsp; &nbsp; UIBarButtonItem *retourButton;<br />&nbsp; &nbsp; Concert *ws;<br />&nbsp; &nbsp; CLLocationCoordinate2D location;<br />&nbsp; &nbsp; UIToolbar *toolBar;<br />&nbsp; &nbsp; UIImage * imageFromImageData;<br />&nbsp;  <br />}<br />@property(nonatomic,strong) Concert *ws;<br />@property(nonatomic,strong) MKMapView *maMapView;<br />@property(nonatomic,strong) UIToolbar *toolBar;<br />@property(nonatomic,strong) MonAnnotation *marker;<br />@end<br />
    


    <br />#import &quot;GPS.h&quot;<br />#import &quot;UIImage+Resize.h&quot;<br /><br /><br />@implementation GPS<br />@synthesize ws,maMapView,toolBar,marker;<br />- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil<br />{<br />&nbsp; &nbsp; self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];<br />&nbsp; &nbsp; if (self) {<br />&nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return self;<br />}<br /><br /><br /><br />#pragma mark - View lifecycle<br /><br />- (void)viewDidLoad<br />{<br />&nbsp; &nbsp; self.title=ws.Ville;<br />&nbsp; &nbsp;  maMapView=[[MKMapView alloc] initWithFrame:CGRectMake(0, 0, 320, 372)];<br />&nbsp; &nbsp;  maMapView.showsUserLocation=YES;<br />&nbsp; &nbsp;  maMapView.mapType=MKMapTypeStandard;<br />&nbsp; &nbsp;  maMapView.delegate=self;<br />&nbsp; &nbsp; &nbsp; &nbsp; [self.view addSubview:maMapView];<br />&nbsp; &nbsp; toolBar=[[UIToolbar alloc]initWithFrame:CGRectMake(0, 372, 320, 44)];<br />&nbsp; &nbsp; toolBar.barStyle=UIBarStyleBlackOpaque;<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [self.view addSubview:toolBar];<br />&nbsp; &nbsp; UIBarButtonItem * bouton1=[[UIBarButtonItem alloc] initWithTitle:@&quot;Direction&quot; style:UIBarButtonItemStyleBordered target:self action:@selector(direction:)];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; UIBarButtonItem *flexItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  target:nil<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  action:nil];<br />&nbsp;  <br />&nbsp; &nbsp; <br /><br />&nbsp; &nbsp; toolBar.items = [NSArray arrayWithObjects: flexItem,bouton1,flexItem, nil];<br />&nbsp;  <br />&nbsp; &nbsp; <br />&nbsp; &nbsp; MKCoordinateRegion region;<br />&nbsp; &nbsp; MKCoordinateSpan span;<br />&nbsp; &nbsp; span.latitudeDelta=0.08;<br />&nbsp; &nbsp; span.longitudeDelta=0.08;<br />&nbsp; &nbsp; CLLocationCoordinate2D coordinate = {[ws.Latitude doubleValue], [ws.Longitude doubleValue]};<br />&nbsp; &nbsp; region.span=span;<br />&nbsp; &nbsp; region.center=coordinate;<br />&nbsp; &nbsp;  marker = [[MonAnnotation alloc] initWithCoordinate:coordinate];<br />&nbsp; &nbsp; marker.title=ws.Lieu;<br />&nbsp; &nbsp; marker.subtitle=ws.Adresse;<br />&nbsp; &nbsp; [maMapView setRegion:region animated:TRUE];<br />&nbsp; &nbsp; [maMapView regionThatFits:region];<br />&nbsp; &nbsp; [maMapView addAnnotation:marker];<br />&nbsp; &nbsp; [maMapView selectAnnotation:marker animated:YES];<br />&nbsp; &nbsp; <br /><br />&nbsp; &nbsp;  [super viewDidLoad];&nbsp;  <br /><br />}<br /><br /><br />-(void)direction:(id)sender{<br />&nbsp; &nbsp; NSString * url=[NSString stringWithFormat:@&quot;http://maps.google.com/maps?daddr=%f,%f&amp;saddr=%f,%f&quot;,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; marker.coordinate.latitude,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; marker.coordinate.longitude,<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  maMapView.userLocation.coordinate.latitude,maMapView.userLocation.coordinate.longitude];<br />&nbsp; &nbsp; &nbsp; &nbsp; [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];<br /> <br />}<br /><br /><br /><br />/*-(void) returnToDetailsConcerts:(id)sender{<br />&nbsp; &nbsp; [self dismissViewControllerAnimated:YES completion:nil];<br />&nbsp; &nbsp; <br />}*/<br /><br /><br /><br />#pragma&nbsp; mark -<br />#pragma mark MkMapView delegate<br /><br /><br /><br /><br />- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation<br />{<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; return (interfaceOrientation == UIInterfaceOrientationPortrait);<br />}<br />- (MKAnnotationView *)mapView:(MKMapView *)theMapView viewForAnnotation:(id&lt;MKAnnotation&gt;)annotation<br />{<br />&nbsp; &nbsp;  if ([annotation isKindOfClass:[MKUserLocation class]])<br />&nbsp; &nbsp;  <br />&nbsp; &nbsp;  return nil;<br />&nbsp; &nbsp; if([annotation isKindOfClass:[MonAnnotation class]])<br />&nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; static NSString* MonAnnotationIdentifier=@&quot;monAnnotationIdentifier&quot;;<br />&nbsp; &nbsp; &nbsp; &nbsp; MKPinAnnotationView* pinView = (MKPinAnnotationView *)[maMapView dequeueReusableAnnotationViewWithIdentifier:MonAnnotationIdentifier];<br />&nbsp; &nbsp; &nbsp; &nbsp; if(!pinView)<br />&nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; MKPinAnnotationView* customPinView = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:MonAnnotationIdentifier];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; customPinView.pinColor=MKPinAnnotationColorRed;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; customPinView.animatesDrop=YES;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; customPinView.canShowCallout=YES;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; if([ws Image]!=nil){<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; imageFromImageData = [[UIImage alloc] initWithData:[ws Image]];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else{<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; imageFromImageData =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle]pathForResource:@&quot;eleazar_80&quot; ofType:@&quot;png&quot;]];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; UIImage *img=[imageFromImageData thumbnailImage:30&nbsp; &nbsp; transparentBorder:0<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; cornerRadius:5<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; interpolationQuality:100];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; UIImageView *leftIconView = [[UIImageView alloc] initWithImage:img];<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; customPinView.leftCalloutAccessoryView = leftIconView;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  return&nbsp; customPinView;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; else<br />&nbsp; &nbsp; &nbsp; &nbsp; {<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; pinView.annotation=annotation;<br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;  <br />&nbsp; &nbsp; &nbsp; &nbsp; }<br />&nbsp; &nbsp; &nbsp; &nbsp; return pinView;<br />&nbsp; &nbsp; }<br />&nbsp; &nbsp; return nil;<br />}<br />- (void)viewDidUnload<br />{<br />&nbsp; &nbsp; maMapView.delegate=nil;<br />&nbsp; &nbsp; maMapView=nil;<br />&nbsp; &nbsp; marker=nil;<br />&nbsp; &nbsp; toolBar=nil;<br /><br />&nbsp;  <br /><br />&nbsp; &nbsp; [super viewDidUnload];<br />&nbsp; &nbsp; <br />}<br />- (void)didReceiveMemoryWarning<br />{<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; [super didReceiveMemoryWarning];<br />&nbsp; &nbsp; <br />&nbsp; &nbsp; <br />}<br /><br />@end<br />
    
  • 01:41 modifié #5
    Je vais te dire ce que tu dois faire dans quelques lignes.




    Lis la documentation:
    http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html
  • paddevpaddev Membre
    01:41 modifié #6
    ok je vais aller voir mais peut tu me donner quelques conseils par rapport au code que j'ai posté.
    merci.
    un oubli d'un @property peut il causer un leak?
  • jgoudeauxjgoudeaux Membre
    novembre 2011 modifié #7
    En fait tout dépend de ce que tu met dans le property ! Par exemple une variable avec un type primitif n'aura jamais de release dans le dealloc et pourtant tu peux faire un :

    @property (nonatomic, readonly) BOOL isABoolValue;

    Tu devrais lire le lien de ldesroziers.

    Et puis faut faire gaf à  ce que tu mets, dans tes property tu ne mets pas de retain sur les objets, à  toi de bien gérer la mémoire et de faire des retain quand besoin.
    Comme tu dis le savoir, le property va simplement redéfinir les getter/setter en fonction des paramètres précisés dans le @property.

    Donc à  moins de redéfinir ces derniers fais bien attention à  la gestion de la mémoire.

    Donc oui un property sans "retain", et ensuite une gestion de passage de variable ou autre sans toi mettre aVar = [maVar retain], peut entraà®ner un LEAK !
    'fin tout dépend aussi de l'objet qui va utiliser la property (s'il fait un retain ou un release dessus...).

    bref, lis le lien de ldesroziers...
  • zoczoc Membre
    01:41 modifié #8
    dans 1322409924:

    Donc oui un property sans "retain", et ensuite une gestion de passage de variable ou autre sans toi mettre aVar = [maVar retain], peut entraà®ner un LEAK !

    Un oubli de retain a plus de chance de provoquer un crash (objet détruit trop tôt) qu'un leak...

  • DrakenDraken Membre
    01:41 modifié #9
    dans 1322409924:


    Et puis faut faire gaf à  ce que tu mets, dans tes property tu ne mets pas de retain sur les objets, à  toi de bien gérer la mémoire et de faire des retain quand besoin.
    Comme tu dis le savoir, le property va simplement redéfinir les getter/setter en fonction des paramètres précisés dans le @property.

    Donc à  moins de redéfinir ces derniers fais bien attention à  la gestion de la mémoire.

    Donc oui un property sans "retain", et ensuite une gestion de passage de variable ou autre sans toi mettre aVar = [maVar retain], peut entraà®ner un LEAK !
    'fin tout dépend aussi de l'objet qui va utiliser la property (s'il fait un retain ou un release dessus...).

    Oui, mais comme il utilise ARC il n'a pas besoin de s'occuper du retain. D'ailleurs la syntaxe dont il se sert :

    @property(nonatomic,strong) MKMapView *maMapView;<br />
    


    gère automatiquement le retain et le release sur la donnée maMapView.

  • AliGatorAliGator Membre, Modérateur
    01:41 modifié #10
    ce qu'il n'empêche pas qu'il faut releaser l'objet en mettant la propriété à  nil dans le viewDidUnload
  • DrakenDraken Membre
    01:41 modifié #11

    Si j'ai bien compris, nul besoin de mettre à  nil les iVars d'une classe. ARC s'occupe de tout comme un grand.

    C'est particulier avec les ViewControllers qui peuvent allouer et désallouer momentanément des objets en réponse à  une demande de l'OS. Dans ce cas, le développeur doit gérer manuellement l'effacement des objets pour récupérer de la place, en les mettant à  nil dans le viewDidUnload.

    J'ai bon, là  ?

  • zoczoc Membre
    01:41 modifié #12
    Tout bon
  • paddevpaddev Membre
    01:41 modifié #13
    Justement dans le cas que j'evoque plus haut (mapview) est ce que mes @property sont utiles ou bien je peux les enlever?
    perso je les ai mis car dans mon fichier.m j'utilise la notation pointé..
    Quelqu'un peut regarder mes fichiers en me disant ce que je peux enlever ou mettre? voir si j'ai bien implenté le viewdidunload et si mes property sont utiles?

    merci
  • 01:41 modifié #14
    Mes bien sûr qu'elle le sont, sinon comment veux-tu accéder à  la variable?  ??? Bien sûr tu pourrais juste laisser l'Ivar mais bon.. on a plutôt tendance à  virer les Ivar et faire que des properties.
    Je te conseille d'utiliser la recherche sur les forums, on a déjà  parlé de ça.
Connectez-vous ou Inscrivez-vous pour répondre.