Mon hypothèse est que la version du compilateur que vous utilisez suit les règles de gestion de la mémoire pour les propriétés déclarées, notamment pour les accesseurs des propriétés déclarées :
Vous possédez 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'elle est synthétisée, donne une méthode appelée -newTitle
, d'où le avertissement/erreur. -newTitle
est censée être une méthode d'obtention pour la propriété newTitle
, cependant les conventions de nommage indiquent qu'une méthode dont le nom commence par new
renvoie un objet possédé par l'appelant, ce qui n'est pas le cas des méthodes d'obtention.
Vous pouvez résoudre cela en :
-
Renommant cette propriété :
@property (strong, nonatomic) NSString *theNewTitle;
-
Conserver le nom de propriété et spécifier un nom d'obtention qui ne commence pas par un des préfixes des noms de méthode spéciaux :
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
-
Conserver à la fois le nom de propriété et le nom de l'obtention, et dire au compilateur que, même si le nom de l'obtention commence par new
, il appartient à la famille de méthodes none
par opposition à la famille de méthodes new
:
#ifndef __has_attribute
#define __has_attribute(x) 0 // Compatibilité avec les compilateurs non-Clang
#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 propriété et comme nom d'obtention, avoir une méthode appelée -newTitle
qui ne retourne pas un objet possédé par l'appelant peut être déroutant pour d'autres personnes lisant votre code.
Pour information, Apple a publié des Notes de mise à jour sur la transition vers l'ARC dans lesquelles ils affirment :
Vous ne pouvez pas donner à une propriété un nom qui commence par new
ou copy
.
Ils ont déjà été informés que leur déclaration n'est pas tout à fait précise : le coupable est le nom de la méthode d'obtention, et non pas le nom de la propriété.
Édition du 17 janvier 2015 : Je viens de remarquer un commit récent à Clang qui suggère l'option 3 ci-dessus (utilisation de objc_method_family(none)
), y compris une correction automatique, pour le cas général où un nom de propriété correspond à l'un des préfixes de la famille de méthodes spéciales. Xcode incorporera probablement ce changement à l'avenir.
0 votes
J'ai eu une erreur très similaire "Property suit les conventions de nommage Cocoa pour retourner des objets 'owned'" La réponse de Bavarious ci-dessous semble également résoudre cela.