Problème sémantique: le getter synthétisé de Property suit la convention de nommage de Cocoa pour renvoyer les objects “possédés”

J’utilise actuellement le SDK iOS 5 pour développer mon application. J’essaie de créer une propriété NSSsortingng, puis de la synthétiser dans le fichier .m (je l’ai déjà fait sans problème). Maintenant, je suis tombé sur ceci: “Problème sémantique: le getter synthétisé de Property suit la convention de nommage de Cocoa pour renvoyer les objects” possédés “.”

Ceci est mon code: .h

@interface ViewController : UIViewController { NSSsortingng *newTitle; } @property (strong, nonatomic) NSSsortingng *newTitle; 

.m

 @synthesize newTitle; 

Est-ce que quelqu’un a une idée de comment je pourrais résoudre ce problème? Merci!!

Je suppose que la version du compilateur que vous utilisez suit également les règles de gestion de la mémoire pour les propriétés déclarées – plus spécifiquement, pour les accesseurs des propriétés déclarées:

Vous prenez possession d’un object si vous le créez en utilisant une méthode dont le nom commence par «alloc», «new», «copy» ou «mutableCopy».

Une propriété nommée newTitle , lorsqu’elle est synthétisée, fournit une méthode appelée -newTitle , d’où l’avertissement / erreur. -newTitle est supposé être une méthode getter pour la propriété newTitle . Cependant, les conventions de nommage indiquent qu’une méthode dont le nom commence par new renvoie un object appartenant à l’appelant, ce qui n’est pas le cas des méthodes getter.

Vous pouvez résoudre ce problème en:

  1. Renommer cette propriété:

     @property (strong, nonatomic) NSSsortingng *theNewTitle; 
  2. Garder le nom de la propriété et spécifier un nom de getter qui ne commence pas par l’un des préfixes de nom de méthode spéciaux:

     @property (strong, nonatomic, getter=theNewTitle) NSSsortingng *newTitle; 
  3. Garder à la fois le nom de la propriété et le nom du getter, et indiquer au compilateur que, même si le nom du getter commence par new , il appartient à la famille none , par opposition à la new famille de méthodes:

     #ifndef __has_atsortingbute #define __has_atsortingbute(x) 0 // Compatibility with non-clang comstackrs #endif #if __has_atsortingbute(objc_method_family) #define BV_OBJC_METHOD_FAMILY_NONE __atsortingbute__((objc_method_family(none))) #else #define BV_OBJC_METHOD_FAMILY_NONE #endif @interface ViewController : UIViewController @property (strong, nonatomic) NSSsortingng *newTitle; - (NSSsortingng *)newTitle BV_OBJC_METHOD_FAMILY_NONE; @end 

    Notez que même si cette solution vous permet de conserver newTitle à la fois en tant que nom de propriété et en tant que nom de getter, avoir une méthode appelée -newTitle qui ne renvoie pas un object appartenant à l’appelant peut être déroutant pour les autres utilisateurs.


Pour la petite histoire, Apple a publié Transitioning to ARC Release Notes , dans lequel il déclare:

Vous ne pouvez pas donner à une propriété un nom qui commence par new ou copy .

Ils ont déjà été avertis que leur déclaration n’est pas tout à fait exacte: le coupable est le nom de la méthode getter, pas le nom de la propriété.


Edit 17 Jan 2015: Je viens de remarquer un récent commit vers Clang qui suggère l’option 3 ci-dessus (en utilisant objc_method_family(none) ), y compris un fix-it, pour le cas général où un nom de propriété correspond à l’un des préfixes de familles de méthodes spéciales . Xcode intégrera probablement ce changement par la suite.

Noms d’object inacceptables

  • nouveauButton
  • copyLabel
  • atsortingbuerTitre

Noms d’objects acceptables

  • neueButton
  • mCopyLabel
  • _allocTitle

#arc # auto-synthétisé # xcode-4.6.1

** MODIFIER **

Apparemment, vous ne pouvez pas utiliser mutableCopy non plus.

Le nom du membre commençant par new est ce qui déclenche l’avertissement. Changez le nom en editTitle et l’avertissement disparaîtra. Je n’ai pas pu trouver de documentation confirmant cela, mais grâce aux tests, j’ai pu déterminer que les variables membres commençant par ‘new’ aggravent le compilateur.

ARC ne permet pas d’utiliser “Nouveau ….” dans le nom de la propriété. mais vous pouvez utiliser “newTitle” en changeant le nom du getter.

 @property (nonatomic, strong, getter=theNewTitle) NSSsortingng *newTitle; 

Il ne semble pas que ce que Bavarious suggérait était ce que tu voulais faire. Tout ce que vous voulez faire, c’est déclarer une variable d’instance NewTitle , puis synthétiser la propriété. Nous devions déclarer la variable d’instance et la propriété. Pas plus.

Maintenant, je crois que la bonne façon de procéder est la suivante:

.h

 @interface ViewController : UIViewController @property (nonatomic, strong) NSSsortingng *newTitle; 

.m

 @synthesize newTitle = _newTitle; // Use instance variable _newTitle for storage 

La variable d’instance de la propriété newTitle est synthétisée. Vous ne voulez pas que votre variable d’instance soit identique à votre propriété – trop facile de faire des erreurs .

Voir Exemple: Déclaration des propriétés et synthèse des accessoires

Dans CoreData, si vous utilisez “new …” dans l’atsortingbut (comstackz normalement), il tombera au hasard avec une exception “bad access”.

Il n’y a pas de journal des incidents et la ligne affichée avec le “point d’arrêt de toutes les exceptions” ne vous aidera pas du tout.

Ecrire un setter manuellement avec le même nom que celui de la propriété a supprimé cet avertissement.

Outre le problème que vous devez / ne pouvez pas utiliser “nouveau” devant vous, laissez une autre chose dire: essayez d’éviter les “nouveaux” devant les noms en général. “Nouveau” dépend du temps. Actuellement, il est nouveau pour vous, mais quelque temps plus tard, vous voudrez peut-être implémenter quelque chose de nouveau. Donc, utiliser “new” dans les noms est toujours mauvais. Essayez de penser ainsi: dans le monde de la programmation, “new” crée toujours quelque chose: une nouvelle instance de quelque chose.

Dans votre cas, lorsque vous souhaitez atsortingbuer un titre différent, le nom actuel de votre propriété sera intituléRemplacement.

Encore une chose: essayez d’abord de nommer les fonctions et les méthodes avec le verbe, comme setSomething ou getSomething. Mais dans les propriétés, essayez d’abord de nommer l’object, comme heightMinimum, heightMaximum, etc. -> lorsque vous utilisez votre inspecteur lorsque vous codez, vous recherchez toujours des objects. Essaye le. 😉

NS_RETURNS_NOT_RETAINED est utilisé pour résoudre le problème de dénomination.

 @property (nonatomic, copy) NSSsortingng *newTitle NS_RETURNS_NOT_RETAINED; 

Nous pouvons trouver sa définition comme suit,

 #define NS_RETURNS_NOT_RETAINED __atsortingbute__((ns_returns_not_retained)) 

L’atsortingbut ‘ns_returns_not_retained’ est le complément de ‘ns_returns_retained’. Lorsqu’une fonction ou une méthode peut sembler obéir aux conventions Cocoa et renvoyer un object Cocoa conservé, cet atsortingbut peut être utilisé pour indiquer que la référence d’object renvoyée ne doit pas être considérée comme une référence “propriétaire” renvoyée à l’appelant. Le framework Foundation définit une macro NS_RETURNS_NOT_RETAINED qui est fonctionnellement équivalente à celle indiquée ci-dessous.

Joindre plus de détails ici.

essaye ça:-

 @property (nonatomic,retain) NSSsortingng *newTitle;