Les propriétés sont une façon d'exposer les données à d'autres classes. Parce qu'ils rendent la gestion de la mémoire plus pratique sur l'iPhone et des applications Cocoa non CCG lorsque vous les déclarez retain, Beaucoup d'entre nous utilisent également des propriétés au sein de notre classe. Lorsque nous utilisons variables d'instance synthétisée, Nous n'avons pas le choix, parce que les variables d'instance sous-jacente créée par le runtime ne sont pas disponibles, même à notre propre classe, et nous devons utiliser les accesseurs et mutateurs de notation ou de dot à leur utilisation.
Ce qui arrive, cependant, quand vous voulez un bien à être en lecture seule à d'autres objets, mais vous aussi vous voulez être en mesure d'utiliser le mutator synthétisés dans votre propre classe d'affecter de nouvelles valeurs? En d'autres termes, qu'est-ce que tu fais quand tu veux une propriété d'être en lecture seule pour le reste du monde, mais en lecture / écriture au sein de votre propre classe?
Extensions à la rescousse. Avant nous avions des extensions, il était commun de déclarer une catégorie dans le haut de votre fichier de mise en œuvre avec toutes les méthodes privées. Cela permettrait d'éviter que le compilateur de se plaindre lorsque vous avez appelé une méthode privée au sein de votre classe. Le compilateur verrait la déclaration de méthode privée dans le fichier de mise lorsque votre classe a été compilée, mais ne verrait pas ces méthodes quand il compilé d'autres classes. En vertu de cette ancienne façon de faire, nous n'aurions tout simplement inclure la méthode mutateur dans la catégorie, et ne mettre l'accesseur dans le fichier d'entête, et qui aurait pour effet rendre la valeur de l'instance en lecture seule pour le reste du monde par ne pas exposer le mutator.
En Objective-C 2.0, cette pratique a été officialisée dans les extensions, qui sont fondamentalement juste anonyme, catégories sans nom. Une chose que vous pouvez faire avec une des extensions est de redéfinir les propriétés de votre déclaration. Ainsi, vous pouvez déclarer une propriété dans votre fichier en-tête comme readonly, Et ensuite dans votre fichier de mise en œuvre, de créer une extension de classe avec les mêmes propriétés re-déclarée comme readwrite. »Et Voil` a! Votre classe sera en mesure d'utiliser à la fois l'accesseur et mutateur pour les propriétés tandis que les classes externes ne seront en mesure d'utiliser l'accesseur. Gâteau et nom nom. La vie est belle.
Et puis, dans le fichier de mise en œuvre, nous devons utiliser une extension de redéfinir ces deux propriétés:
C'est un truc simple, mais avec le potentiel pour rendre votre vie plus agréable.
Ce qui arrive, cependant, quand vous voulez un bien à être en lecture seule à d'autres objets, mais vous aussi vous voulez être en mesure d'utiliser le mutator synthétisés dans votre propre classe d'affecter de nouvelles valeurs? En d'autres termes, qu'est-ce que tu fais quand tu veux une propriété d'être en lecture seule pour le reste du monde, mais en lecture / écriture au sein de votre propre classe?
Extensions à la rescousse. Avant nous avions des extensions, il était commun de déclarer une catégorie dans le haut de votre fichier de mise en œuvre avec toutes les méthodes privées. Cela permettrait d'éviter que le compilateur de se plaindre lorsque vous avez appelé une méthode privée au sein de votre classe. Le compilateur verrait la déclaration de méthode privée dans le fichier de mise lorsque votre classe a été compilée, mais ne verrait pas ces méthodes quand il compilé d'autres classes. En vertu de cette ancienne façon de faire, nous n'aurions tout simplement inclure la méthode mutateur dans la catégorie, et ne mettre l'accesseur dans le fichier d'entête, et qui aurait pour effet rendre la valeur de l'instance en lecture seule pour le reste du monde par ne pas exposer le mutator.
En Objective-C 2.0, cette pratique a été officialisée dans les extensions, qui sont fondamentalement juste anonyme, catégories sans nom. Une chose que vous pouvez faire avec une des extensions est de redéfinir les propriétés de votre déclaration. Ainsi, vous pouvez déclarer une propriété dans votre fichier en-tête comme readonly, Et ensuite dans votre fichier de mise en œuvre, de créer une extension de classe avec les mêmes propriétés re-déclarée comme readwrite. »Et Voil` a! Votre classe sera en mesure d'utiliser à la fois l'accesseur et mutateur pour les propriétés tandis que les classes externes ne seront en mesure d'utiliser l'accesseur. Gâteau et nom nom. La vie est belle.
Note: vous ne pouvez pas changer tous les aspects d'une propriété. Vous ne pouvez pas, par exemple, déclarer le copier dans votre fichier d'entête et de conserver dans votre extension.Regardons un exemple simple. Disons que nous avons écrit une sous-classe de NSOperation qui avait deux propriétés. Nous voulons que ces valeurs soient fixées par l'appel d'init, mais parce que notre opération va s'exécuter simultanément sur un autre thread, nous ne voulons pas les valeurs a changé après que des objets extérieurs, mais nous pouvons avoir besoin de changer nous-mêmes. Pour ce faire, nous pourrions déclarer notre classe comme ceci:
#import <Foundation/Foundation.h>
#import <QTKit/QTKit.h>
@interface MyUpdateOperation : NSOperation {
}
@property (readonly, copy) QTMovie *movie;
@property (readonly, copy) NSView *view;
- (id)initWithMovie:(QTMovie *)inMovie andView:(NSView *)inView;
@end
Et puis, dans le fichier de mise en œuvre, nous devons utiliser une extension de redéfinir ces deux propriétés:
#import "MyUpdateOperation.h"
@interface MyUpdateOperation ()
@property (readwrite, copy) QTMovie *movie;
@property (readwrite, copy) NSView *view;
@end
@implementation MyUpdateOperation
- (id)initWithMovie:(QTMovie *)inMovie andView:(NSView *)inView
{
// Logic goes here
}
-(void)main
{
// Logic goes here
}
@end
C'est un truc simple, mais avec le potentiel pour rendre votre vie plus agréable.
Aucun commentaire:
Enregistrer un commentaire