Objective-C 中下列类属性的写法有何不同?
PHPz
PHPz 2017-04-21 11:16:48
0
4
412

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. 一般情况下应该如何写?

PHPz
PHPz

学习是最好的投资!

répondre à tous(4)
迷茫

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.
Peter_Zhu

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.

迷茫

@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.

小葫芦
  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é.

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal