Je pense que la version du compilateur que vous utilisez est la suivante les règles de gestion de la mémoire pour les propriétés déclarées, également - plus spécifiquement, pour les accesseurs des propriétés déclarées :
Vous prenez possession d'un objet 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'il est synthétisé, donne une méthode appelée -newTitle
d'où l'avertissement/erreur. -newTitle
est censé être une méthode getter pour le module newTitle
cependant, les conventions d'appellation stipulent qu'une méthode dont le nom commence par new
renvoie un objet qui appartient à 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é :
@property (strong, nonatomic) NSString *theNewTitle;
-
Conserver le nom de la propriété et spécifier un nom de getter qui ne commence pas par l'un des préfixes spéciaux de nom de méthode :
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
-
En conservant à la fois le nom de la propriété et celui du getter, et en indiquant au compilateur que, même si le nom du getter commence par new
il appartient à la none
par opposition à la famille de méthodes new
famille de méthodes :
#ifndef __has_attribute
#define __has_attribute(x) 0 // Compatibility with non-clang compilers
#endif
#if __has_attribute(objc_method_family)
#define BV_OBJC_METHOD_FAMILY_NONE __attribute__((objc_method_family(none)))
#else
#define BV_OBJC_METHOD_FAMILY_NONE
#endif
@interface ViewController : UIViewController
@property (strong, nonatomic) NSString *newTitle;
- (NSString *)newTitle BV_OBJC_METHOD_FAMILY_NONE;
@end
Notez que même si cette solution vous permet de garder newTitle
à la fois comme nom de la propriété et comme nom du récupérateur, en ayant une méthode appelée -newTitle
qui ne renvoie pas un objet appartenant à l'appelant peut être source de confusion pour les autres personnes lisant votre code.
Pour mémoire, Apple a publié Transition vers les notes de version ARC dans lequel ils déclarent :
Vous ne pouvez pas donner à une propriété un nom qui commence par new
o copy
.
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 Jan 2015 : Je viens de remarquer livraison récente de Clang qui suggère l'option 3 ci-dessus (utiliser objc_method_family(none)
), incluant un correctif, pour le cas général où un nom de propriété correspond à l'un des préfixes spéciaux de la famille de méthodes. Xcode intégrera probablement cette modification à terme.
0 votes
J'avais une erreur très similaire "Property follows Cocoa naming conventions for returning 'owned' objects" La réponse de Bavarious ci-dessous semble également résoudre ce problème.