En tant que personne qui est nouvelle à Objective-C, quelqu'un peut-il me donner un aperçu de la conservation, de l'attribution, de la copie et de toutes les autres qui me manquent, qui suivent la directive @property? Que font-ils et pourquoi voudrais-je les utiliser les uns par rapport aux autres?
ios
objective-c
iphone
memory-management
Mark Reid
la source
la source
Réponses:
L'article lié par MrMage ne fonctionne plus. Voici donc ce que j'ai appris lors de mon (très) court codage en Objective-C:
non atomique vs atomique - "atomique" est la valeur par défaut. Utilisez toujours "non anatomique". Je ne sais pas pourquoi, mais le livre que j'ai lu dit qu'il y a "rarement une raison" d'utiliser "atomique". (BTW: Le livre que j'ai lu est le livre BNR "Programmation iOS".)
readwrite vs readonly - "readwrite" est la valeur par défaut. Lorsque vous @synthétisez, un getter et un setter seront créés pour vous. Si vous utilisez "lecture seule", aucun setter ne sera créé. Utilisez-le pour une valeur que vous ne souhaitez pas modifier après l'instanciation de l'objet.
conserver vs copier vs assigner
la source
atomic
est tout aussi mauvais que conseillernonatomic
. Aucun des deux choix n'est "correct", les concepteurs de langage ont donc opté pour la plus sûre des deux solutions. En fait,nonatomic
c'est généralement le meilleur choix car il omet les verrous de fil extrêmement coûteux. La seule raison d'utiliseratomic
est si votre propriété peut être définie à partir de plusieurs threads (auquel cas l'omettre peut entraîner une libération excessive ou une fuite).Avant de connaître les attributs de @property, vous devez savoir à quoi sert @property.
@property offre un moyen de définir les informations qu'une classe est destinée à encapsuler. Si vous déclarez un objet / variable à l'aide de @property , cet objet / variable sera accessible aux autres classes qui importent sa classe.
Si vous déclarez un objet en utilisant @property dans le fichier d'en-tête, vous devez alors le synthétiser en utilisant @synthesize dans le fichier d'implémentation. Cela rend l'objet conforme KVC . Par défaut, le compilateur synthétisera les méthodes d'accesseur pour cet objet.
Les méthodes d'accesseur sont: setter et getter.
Exemple: .h
.m
Le compilateur va maintenant synthétiser les méthodes d'accesseur pour le nom .
Liste des attributs de @property
atomique, non atomique, conserver, copier, lecture seule, lecture-écriture, assigner, fort, getter = méthode, setter = méthode, unsafe_unretained
atomic est le comportement par défaut. Si un objet est déclaré atomique, il devient thread-safe. Thread-safe signifie qu'à la fois un seul thread d'une instance particulière de cette classe peut avoir le contrôle sur cet objet.
Si le thread exécute la méthode getter, aucun autre thread ne peut exécuter la méthode setter sur cet objet. C'est lent.
Pour cette raison, il est plus rapide d'accéder à une propriété non atomique qu'à une propriété atomique.
La méthode de définition augmentera le nombre de rétentions de l'objet, de sorte qu'il occupera de la mémoire dans le pool de libération automatique.
Même si une chaîne mutable est définie et modifiée par la suite, l'instance capture la valeur qu'elle a au moment où elle est définie. Aucune méthode setter et getter ne sera synthétisée.
maintenant,
le nom ne sera pas affecté.
Le compilateur va générer un getter, mais pas un setter.
C'est l'opposé de readonly.
Gardez à l'esprit que la conservation et l'attribution sont essentiellement interchangeables lorsque la récupération de place est activée.
Il est livré avec ARC.
Dans le cas des propriétés booléennes (propriétés qui ont une valeur OUI ou NON), il est habituel que la méthode getter commence par le mot «est»
La méthode doit se terminer par deux points.
Une référence non sécurisée est similaire à une référence faible en ce qu'elle ne maintient pas en vie son objet associé, mais elle ne sera pas définie sur nil si l'objet de destination est désalloué.
Si vous devez spécifier plusieurs attributs, incluez-les simplement en tant que liste séparée par des virgules, comme ceci:
la source
@property
dans le fichier d'en-tête, alors vous devez le synthétiser en utilisant@synthesize
dans le fichier d'implémentation." Pas toujours. Par exemple, "Par défaut, unereadwrite
propriété sera soutenue par une variable d'instance, qui sera à nouveau synthétisée automatiquement par le compilateur." Du doc .Après avoir lu de nombreux articles, j'ai décidé de rassembler toutes les informations sur les attributs:
Vous trouverez ci-dessous un lien vers l'article détaillé où vous pouvez trouver ces attributs.
Un grand merci à toutes les personnes qui donnent les meilleures réponses ici !!
Voici l'exemple de description de l'article
Exemple :
Exemple:
Explique:
Supposons qu'il existe une propriété de chaîne atomique appelée "nom", et si vous appelez [self setName: @ "A"] à partir du thread A, appelez [self setName: @ "B"] à partir du thread B, et appelez [self name] à partir de thread C, alors toutes les opérations sur un thread différent seront effectuées en série, ce qui signifie que si un thread exécute setter ou getter, les autres threads attendront. Cela rend la propriété "nom" accessible en lecture / écriture, mais si un autre thread D appelle [libération de nom] simultanément, cette opération peut produire un plantage car aucun appel setter / getter n'est impliqué ici. Ce qui signifie qu'un objet est protégé en lecture / écriture (ATOMIQUE) mais pas en thread car un autre thread peut envoyer simultanément tout type de messages à l'objet. Le développeur doit garantir la sécurité des threads pour ces objets.
Si la propriété "nom" n'était pas atomique, alors tous les threads de l'exemple ci-dessus - A, B, C et D s'exécuteront simultanément produisant tout résultat imprévisible. En cas d'atomique, l'un de A, B ou C s'exécutera en premier mais D peut toujours s'exécuter en parallèle.
Exemple:
Exemple :
Explication forte et faible, merci à BJ Homer :
Imaginez que notre objet soit un chien et que le chien veuille s'enfuir (être désalloué). Les pointeurs puissants sont comme une laisse sur le chien. Tant que la laisse est attachée au chien, le chien ne s'enfuira pas. Si cinq personnes attachent leur laisse à un chien (cinq pointeurs solides vers un objet), le chien ne s'enfuira pas tant que les cinq laisses ne seront pas détachées. Les pointeurs faibles, par contre, sont comme des petits enfants qui pointent vers le chien et disent «Regardez! Tant que le chien est toujours en laisse, les petits enfants peuvent toujours voir le chien et ils le pointeront toujours. Dès que toutes les laisses sont détachées, le chien s'enfuit, peu importe le nombre de petits enfants qui le désignent. Dès que le dernier pointeur fort (laisse) ne pointe plus sur un objet, l'objet sera désalloué et tous les pointeurs faibles seront mis à zéro. Lorsque nous utilisons faible? La seule fois que vous voudriez utiliser faible, c'est si vous voulez éviter les cycles de rétention (par exemple, le parent retient l'enfant et l'enfant conserve le parent afin qu'aucun des deux ne soit jamais libéré).
Exemple:
Exemple:
unsafe_unretained
-unsafe_unretained est un qualificatif de propriété qui indique à ARC comment insérer des appels de retenue / libération -unsafe_unretained est la version ARC de assign.
Exemple:
Exemple:
la source
La propriété atomique est accessible par un seul thread à la fois. Il est thread-safe . La valeur par défaut est atomique. Veuillez noter qu'il n'y a pas de mot-clé atomique
Nonatomic moyen filetage multiple peut accéder à l'élément .Il est dangereux de fil
Il faut donc être très prudent lors de l'utilisation atomique .Comme cela affecte les performances de votre code
la source
préfère ce lien sur les propriétés dans objective-c dans iOS ...
https://techguy1996.blogspot.com/2020/02/properties-in-objective-c-ios.html
la source