recherche

Maison  >  Questions et réponses  >  le corps du texte

Objective-C 中下列类属性的写法有何不同?

1. 在 .h 文件中,例如:

@interface PullToRefreshView : UIView {
	UILabel *lastUpdatedLabel;
	UILabel *statusLabel;
	CALayer *arrowImage;
	UIActivityIndicatorView *activityView;
}

2. 在 .h 文件中,例如:

@property (nonatomic, strong) UIScrollView *scrollView;

3. 在 .m 文件中,例如:

@interface PullToRefreshView

@property (nonatomic, strong) NSArray *titles;

@end

4. 在 .m 文件中,例如:

@implementation TopicListViewController {
    PullToRefreshView *pull
}

简而言之,是否是
1. 在头文件中的是 public 属性,在 .m 中的是 private 属性?
2. 在 @interface 和 @implementation 中用大括号扩起来的和 @property 有何区别?(除了synthesize方面)
3. 一般情况下应该如何写?

PHPzPHPz2769 Il y a quelques jours415

répondre à tous(4)je répondrai

  • 迷茫

    迷茫2017-04-21 11:18:48

    En supposant que la manière particulière d'utiliser @private pour déclarer des variables n'est pas prise en compte, dans object-c, tant que les variables et attributs déclarés peuvent être utilisés dans le fichier .m contenant cette déclaration.

    Bien sûr, tout rendre public n'est pas conforme à l'encapsulation dans la conception orientée objet. Ces variables et attributs écrits directement en .m servent à masquer les informations et à assurer l'encapsulation. Le nom officiel de cette méthode est Category , qui est. considéré comme une méthode nécessaire pour écrire une bibliothèque object-c.

    Donc, la réponse à toutes les questions :

    1. sont tous publics, mais les fichiers .m ne peuvent pas être #importés et private
    2. est indirectement implémenté.
    3. Ce qui est entre accolades est la variable d'instance, qui n'est qu'une simple valeur numérique. Elle ne peut pas être liée à la méthode get/set et ne peut pas automatiquement conserver/copier/atomique. qui suit l'instance ; Property est une encapsulation syntaxique (appelée sucre syntaxique) de la méthode get/set, transformant deux déclarations de méthode en une seule déclaration de propriété et vous aidant à accomplir de nombreuses tâches de base en annotant divers attributs.
    4. J'ai vu certaines bibliothèques écrire les déclarations qui sont exposées à l'extérieur dans Foo.h, puis écrire les déclarations qui ne sont pas exposées à l'extérieur dans Foo+Internal.h Grâce à cette convention, on dit à l'appelant de ne pas le faire. pour m'utiliser. Variables internes, propriétés et méthodes. Personnellement, je préfère cette approche.

    répondre
    0
  • 天蓬老师

    天蓬老师2017-04-21 11:18:48

    Ce qui est écrit directement à l'intérieur de {} est variable d'instance , et ce qui est écrit avec @property devant est attribut . Pour les attributs, obj-c générera automatiquement une variable d'instance, puis lors de l'accès à l'attribut (en utilisant la méthode get/set ou en utilisant obj.attr), cette variable d'instance générée automatiquement sera utilisée et fera d'autres choses supplémentaires.

    répondre
    0
  • 迷茫

    迷茫2017-04-21 11:18:48

    @Huan Du l'a déjà très bien dit, parlons de mes habitudes d'utilisation

    1. Au lieu d'utiliser ivar, déclarez @property dans l'extension de classe, afin de pouvoir utiliser self.xxx en interne pour obtenir/définir la valeur, et le code aura l'air plus confortable.

    2. Dans le fichier d'en-tête, déclarez uniquement les méthodes/propriétés visibles par le monde extérieur, afin que le contenu du fichier d'en-tête soit aussi petit et clair que possible. S’il existe une propriété en lecture seule en externe et en lecture-écriture en interne, vous pouvez re-déclarer la propriété en lecture-écriture dans l’extension de classe.

    répondre
    0
  • 高洛峰

    高洛峰2017-04-21 11:18:48

    1. instance, publique
    2. propriété (instance, setter, getter générés automatiquement), publique
    3. Identique à 2
    4. instance, publique

    Vous pouvez utiliser @private devant l'instance

    Mon approche générale, qui est également le format de code généré automatiquement par XCode, est d'écrire public en tant que @property et de le mettre dans le fichier .h, et privé en tant que

    @interface Foo ()
    
    @property Bar bar;
    
    @end

    Mettez-le dans le fichier .m.

    Les parenthèses vides sont une catégorie. Vous pouvez la laisser vide ou l'écrire comme cachée. Bref, les autres classes ne pourront pas voir cette propriété.

    répondre
    0
  • Annulerrépondre