J'utilise actuellement le SDK iOS 5 pour développer mon application. J'essaie de faire une NSString une propriété, 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 la propriété suit la convention de nommage Cocoa pour retourner les objets" possédés "."
Voici mon code: .h
@interface ViewController : UIViewController {
NSString *newTitle;
}
@property (strong, nonatomic) NSString *newTitle;
.m
@synthesize newTitle;
Quelqu'un a-t-il une idée de comment je pourrais résoudre ce problème? Merci!!
Réponses:
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:
Une propriété nommée
newTitle
, lorsqu'elle est synthétisée, produit une méthode appelée-newTitle
, d'où l'avertissement / l'erreur.-newTitle
est censé être une méthode getter pour lanewTitle
propriété, mais les conventions de dénomination stipulent qu'une méthode dont le nom commence parnew
retourne un objet appartenant à l'appelant, ce qui n'est pas le cas des méthodes getter.Vous pouvez résoudre ce problème en:
Renommer cette propriété:
Conserver 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:
Conserver 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 à lanone
famille de méthodes, par opposition à lanew
famille de méthodes:Notez que même si cette solution vous permet de conserver
newTitle
à la fois le nom de la propriété et le nom du getter, avoir une méthode appelée-newTitle
qui ne retourne pas un objet appartenant à l'appelant peut être déroutant pour les autres personnes qui lisent votre code.Pour mémoire, Apple a publié Transitioning to ARC Release Notes , dans lequel ils déclarent:
Ils ont déjà été informés 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 janvier 2015: Je viens de remarquer un récent commit à Clang qui suggère l'option 3 ci-dessus (en utilisant
objc_method_family(none)
), y compris un correctif, pour le cas général où un nom de propriété correspond à l'un des préfixes de famille de méthodes spéciales. Xcode incorporera probablement ce changement à terme.la source
NS_RETURNS_NOT_RETAINED
c'est aussi ce dont vous avez besoin.Noms d'objets inacceptables
Noms d'objets acceptables
#arc # auto-synthétisé # xcode-4.6.1
** ÉDITER **
Apparemment, vous ne pouvez pas non plus utiliser mutableCopy .
la source
Le nom du membre commençant par new est ce qui déclenche l'avertissement. Remplacez le nom par le titre édité 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 «nouveau» aggravent le compilateur.
la source
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.
la source
Cela ne ressemble pas à ce que Bavarious suggérait comme ce que vous vouliez faire. Tout ce que vous voulez faire est de déclarer une variable d'instance
NewTitle
, puis de synthétiser la propriété. Auparavant, nous devions déclarer la variable et la propriété d'instance. Pas plus.Maintenant, je crois que la bonne façon de procéder est la suivante:
.h
.m
La variable d'instance de la propriété
newTitle
est synthétisée. Vous ne voulez pas que votre variable d'instance soit la même que votre propriété - trop facile de faire des erreurs .Voir Exemple: Déclaration de propriétés et synthèse d'accesseurs
la source
NS_RETURNS_NOT_RETAINED
est ce dont vous avez besoin.Dans CoreData, si vous utilisez "new ..." dans l'attribut (compiler normalement), il se bloquera aléatoirement avec une exception "mauvais accès".
Il n'y a pas de journal de plantage et la ligne affichée avec le «point d'arrêt Toutes les exceptions» ne vous aidera pas du tout.
la source
L'écriture manuelle d'un setter avec le nom identique à celui de la propriété a supprimé cet avertissement.
la source
Outre le problème que vous devez / ne pouvez pas utiliser "nouveau" devant vos noms de propriété, disons encore une chose: essayez d'éviter "nouveau" devant les noms en général. "Nouveau" dépend du temps. Actuellement, c'est nouveau pour vous, mais quelque temps plus tard, vous voudrez peut-être implémenter à nouveau quelque chose de nouveau. Donc, utiliser "nouveau" dans les noms est toujours mauvais. Essayez de penser de cette façon: Dans le monde de la programmation, "nouveau" crée toujours quelque chose: une nouvelle instance de quelque chose.
Dans votre cas, lorsque vous souhaitez attribuer un titre différent, puis le nom actuel de votre propriété titleReplacement.
Encore une chose: essayez de nommer les fonctions et les méthodes avec le verbe en premier, comme setSomething ou getSomething. Mais dans les propriétés, essayez d'abord de nommer l'objet, comme heightMinimum, heightMaximum, etc. -> lorsque vous utilisez votre inspecteur lorsque vous codez, vous recherchez toujours des objets. Essaye le. ;-)
la source
NS_RETURNS_NOT_RETAINED
est utilisé pour résoudre le problème de dénomination.Nous pouvons trouver sa définition comme suit,
Joignez plus de détails ici.
la source
essaye ça:-
la source