Supongo que la versión del compilador que está usando sigue las reglas de administración de memoria para las propiedades declaradas, más específicamente, para los accesores de las propiedades declaradas:
Usted toma posesión de un objeto si lo crea usando un método cuyo nombre comienza con "alloc", "new", "copy" o "mutableCopy".
Una propiedad denominada newTitle
, cuando se sintetiza, produce un método llamado -newTitle
, de ahí la advertencia / error. -newTitle
se supone que es un método getter para la newTitle
propiedad, sin embargo, las convenciones de nomenclatura establecen que un método cuyo nombre comienza con new
devuelve un objeto que pertenece al llamador, que no es el caso de los métodos getter.
Puedes resolver esto de la siguiente manera:
Renombrar esa propiedad:
@property (strong, nonatomic) NSString *theNewTitle;
Mantener el nombre de la propiedad y especificar un nombre getter que no comience con uno de los prefijos de nombres de métodos especiales:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
Mantener tanto el nombre de la propiedad como el nombre del captador, y decirle al compilador que, aunque el nombre del captador comienza con new
, pertenece a la none
familia de métodos en lugar de a la new
familia de métodos:
#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
Tenga en cuenta que aunque esta solución le permite mantener newTitle
tanto el nombre de la propiedad como el nombre del captador, tener un método llamado -newTitle
que no devuelva un objeto propiedad de la persona que llama puede ser confuso para otras personas que leen su código.
Para el registro, Apple ha publicado Transition to ARC Release Notes , en el que declaran:
No puede dar a una propiedad un nombre que comience con new
o copy
.
Ya se les ha notificado que su declaración no es del todo precisa: el culpable es el nombre del método getter, no el nombre de la propiedad.
Edición 17 de enero de 2015: Acabo de notar un compromiso reciente con Clang que sugiere la opción 3 anterior (usando objc_method_family(none)
), incluido un arreglo, para el caso general en el que el nombre de una propiedad coincide con uno de los prefijos de familia de métodos especiales. Xcode probablemente incorporará este cambio eventualmente.