Problema semántico: el Getter sintetizado de la propiedad sigue la Convención de Naming de Cocoa para devolver objetos 'propiedad'
-
27-10-2019 - |
Pregunta
Actualmente estoy usando el iOS 5 SDK tratando de desarrollar mi aplicación. Estoy tratando de hacer de una propiedad NSString y luego sintetizarla en el archivo .m (he hecho esto antes sin problemas). Ahora, me encontré con esto: "Problema semántico: el Getter sintetizado de la propiedad sigue la Convención de nombres de cacao para devolver objetos 'propiedad'".
Este es mi código: .h
@interface ViewController : UIViewController {
NSString *newTitle;
}
@property (strong, nonatomic) NSString *newTitle;
.metro
@synthesize newTitle;
¿Alguien tiene una pista de cómo podría solucionar esto? ¡¡Gracias!!
Solución
Supongo que sigue la versión del compilador que estás usando las reglas de gestión de la memoria Para las propiedades declaradas, también, más específicamente, para los accesores de propiedades declaradas:
Usted toma posesión de un objeto si lo crea utilizando un método cuyo nombre comienza con "asignado", "nuevo", "copia" o "mutableCopy".
Una propiedad nombrada newTitle
, cuando se sintetiza, produce un método llamado -newTitle
, de ahí la advertencia/error. -newTitle
se supone que es un método de obtener para el newTitle
propiedad, sin embargo, las convenciones de nombres establecen que un método cuyo nombre comienza con new
Devuelve un objeto que es propiedad de la persona que llama, que no es el caso de los métodos de Getter.
Puedes resolver esto por:
Renombrar esa propiedad:
@property (strong, nonatomic) NSString *theNewTitle;
Mantener el nombre de la propiedad y especificar un nombre de Getter que no comienza con uno de los prefijos de nombre de método especial:
@property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;
Mantener tanto el nombre de la propiedad como el nombre de la getter, y decirle al compilador que, a pesar de que el nombre de Getter comienza con
new
, pertenece alnone
Método Familia en lugar delnew
Método Familia:#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 a pesar de que esta solución le permite mantener
newTitle
Como el nombre de la propiedad y el nombre de Getter, que se llama un método-newTitle
Eso no devuelve 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 Transición a las notas de lanzamiento de arco, en el que indican:
No puede darle a una propiedad un nombre que comience con
new
ocopy
.
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.
Editar 17 de enero de 2015: Acabo de notar un Compromiso reciente con Clang Eso sugiere la opción 3 anterior (usando objc_method_family(none)
), incluido un Fix-It, para el caso general donde un nombre de propiedad coincide con uno de los prefijos familiares de métodos especiales. Xcode probablemente incorporará este cambio eventualmente.
Otros consejos
Nombres de objetos inaceptables
- botón nuevo
- copylabel
- asignar
Nombres de objetos aceptables
- neuebutton
- mcopylabel
- _aloctitle
#Arc #Auto sintetizado #xcode-4.6.1
** EDITAR **
Aparentemente no puedes usar mutablecopia o.
El nombre del miembro que comienza con nuevo es lo que desencadena la advertencia. Cambie el nombre a EditedTitle y la advertencia desaparecerá. No pude encontrar documentación que confirmara esto, pero a través de las pruebas pude determinar que las variables de los miembros que comienzan con 'nuevo' agraven el compilador.
ARC no permite usar "nuevo ..." en el nombre de la propiedad. Pero puede usar "Newtitle" cambiando el nombre de Getter.
@property (nonatomic, strong, getter=theNewTitle) NSString *newTitle;
No parece que lo que sugiriera Bavarious era lo que querías hacer. Todo lo que quieres hacer es declarar una variable de instancia NewTitle
y luego sintetiza la propiedad. Solíamos tener que declarar la variable de instancia y la propiedad. No más.
Ahora, creo que la forma correcta de hacer esto es la siguiente:
.h
@interface ViewController : UIViewController
@property (nonatomic, strong) NSString *newTitle;
.metro
@synthesize newTitle = _newTitle; // Use instance variable _newTitle for storage
La variable de instancia para la propiedad newTitle
se sintetiza. No desea que su variable de instancia sea la misma que su propiedad - Demasiado fácil de cometer errores.
En Coredata, si usa "nuevo ..." en el atributo (compila normalmente) se bloqueará al azar con una excepción de "mal acceso".
No hay registro de bloqueo y la línea que se muestra con el "punto de interrupción de todas las excepciones" no lo ayudará en absoluto.
Escribir un setter manualmente con el nombre igual que la propiedad eliminó esta advertencia.
Además del problema de que debe/no puede usar "nuevo" frente a sus nombres de propiedad, digamos una cosa más: trate de evitar "nuevo" frente a los nombres en general. "Nuevo" depende del tiempo. Actualmente es nuevo para usted, pero en algún momento más tarde tal vez quiera implementar algo nuevo nuevamente. Entonces, usar "nuevo" en los nombres siempre es malo. Trate de pensar de esta manera: en el mundo de la programación, "nuevo" siempre está creando algo: una nueva instancia de algo.
En su caso, cuando desee asignar un título diferente, el nombre actual de su propiedad TitleRePlausion.
Una cosa más: intente nombrar funciones y métodos con el verbo primero, como setsomething o getting. Pero en las propiedades, intente nombrar el objeto primero, como HeightMinimum, HeightMaximum, etc. -> Cuando usa su inspector cuando está codificando, siempre busca objetos. Pruébalo. ;-)
NS_RETURNS_NOT_RETAINED
se usa para resolver el problema de nombres.
@property (nonatomic, copy) NSString *newTitle NS_RETURNS_NOT_RETAINED;
Podemos encontrar su definición como sigue,
#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))
El atributo 'ns_returns_not_retined' es el complemento de 'ns_returns_etined'. Cuando una función o método puede parecer para obedecer las convenciones de cacao y devolver un objeto de cacao retenido, este atributo puede usarse para indicar que la referencia del objeto devuelta no debe considerarse como una referencia de "propiedad" que se devuelve a la persona que llama. El marco de la Fundación define una macro NS_RETurns_Not_Retined que es funcionalmente equivalente al que se muestra a continuación.
Adjuntar más detalles aquí.
prueba esto:-
@property (nonatomic,retain) NSString *newTitle;