2011-09-18 3 views
3

dupliquées possible:
Property Declaration and Automatic Backing Storage AllocationiOS - Objectif C - Question sur les propriétés

Je suis assez nouveau à Objective-C et je voudrais poser une question fondamentale. Je suis en train de comprendre quelle est la différence entre les deux exemples suivants:

@interface MyViewController : UIViewController { 

     UIImageView *myImageView; 
    } 

    @property (nonatomic, retain) UIImageView *myImageView; 

    @end 

et:

@interface MyViewController : UIViewController { 

    } 

    @property (nonatomic, retain) UIImageView *myImageView; 

    @end 

Quelle est la bonne approche? Je connais l'utilisation des propriétés et ce que signifie une propriété. La question est quelle est la différence du premier exemple à la seconde? Y a-t-il une différence de mémoire?

Merci à l'avance,

Andreas

+0

Parmi beaucoup d'autres. S'il vous plaît faire une recherche - il ya une tonne de bonnes informations à ce sujet déjà disponible: http://stackoverflow.com/search?page=2&tab=relevance&q=%5bobjc%5d%20declare%20ivar%20property –

Répondre

8

Le premier exemple utilise une variable de support explicitepour la propriété. C'est-à-dire: vous avez défini la variable de support et pouvez y accéder directement.

Dans le deuxième exemple, Objective-C implicite crée la variable de support pour vous. Puisque vous ne connaissez pas son nom, vous ne pouvez pas y accéder directement.

Cependant, vous pouvez dire Objective-C comment nommer:

@synthesize myImageView = myImageViewVariable; 

Maintenant, vous pouvez accéder directement à myImageViewVariable. Vous pouvez également utiliser la même syntaxe si vous souhaitez utiliser une variable de support différente. Par exemple, je préfère le faire de cette façon:

@interface Foo : NSObject { 
    Bar *baz_; 
} 

@property (nonatomic, retain) Bar *baz; 
@end 

@implementation Foo 
@synthesize baz = baz_; 
@end 

C'est une question de goût, j'aime simplement avoir un nom différent pour la variable de support. Je n'aurais pas besoin de le déclarer explicitement, mais je n'aime pas les actions implicites.

+0

Ici, dans l'exemple, qu'est-ce que myImageViewVariable? Je veux dire que j'ai myImageView et que vous l'instanciez avec myImageViewVariable. Pourquoi alors accédez-vous à myImageViewVariable et non à myImageView, qui est votre propriété? – andreasv

+0

Dans mon exemple, vous pouvez accéder à la propriété ('self.myImageView') ou vous pouvez accéder directement à la variable de sauvegarde (' myImageViewVariable'). – DarkDust

+0

L'avantage de l'accès à la propriété est qu'elle est plus robuste lorsque vous sous-classez, des choses comme la conservation sont prises en charge. L'accès à la variable de sauvegarde est légèrement plus rapide (aucun appel de méthode n'est effectué), mais l'inconvénient est que c'est problématique lorsque vous sous-classez et que vous devez également faire vous-même la gestion de la mémoire. Le mélange des méthodes d'accès est OK, btw. Comme: 'self.property = newObject; [self doSomething: propriétéBackingVariable]; ' – DarkDust

2

La seconde approche utilise Ivars dynamique. Voir ce grand article: http://cocoawithlove.com/2010/03/dynamic-ivars-solving-fragile-base.html

+0

ainsi pour éclaircir les choses. Il est évident que la deuxième méthode pour autant que j'ai compris de l'article est préférable, surtout dans les cas où vous avez plusieurs héritages entre vos classes. Si le contrôleur que je montre dans l'exemple ci-dessus est le dernier enfant, quelle serait la bonne approche .. Je suppose de ce que j'ai compris qu'ils sont tous deux les mêmes! – andreasv

+0

... tant que vous ne voulez pas écrire de code rétrocompatible, considérez-les comme identiques. – vikingosegundo

+0

Est-ce qu'Apple a des préoccupations à l'égard de ces approches pour une soumission d'application iPhone? Je veux dire est-il un moyen qui peut conduire à un rejet et je devrais suivre un modèle spécifique? – andreasv

1

Le second exige l'exécution moderne - qui est iOS et 64 bits Mac OS X

Vous pouvez définir le magasin de support lorsque vous @synthesize la propriété dans la mise en œuvre.