Problema semántico: el Getter sintetizado de la propiedad sigue la Convención de Naming de Cocoa para devolver objetos 'propiedad'

StackOverflow https://stackoverflow.com/questions/6327448

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!!

¿Fue útil?

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:

  1. Renombrar esa propiedad:

    @property (strong, nonatomic) NSString *theNewTitle;
    
  2. 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;
    
  3. 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 al none Método Familia en lugar del new 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 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.


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.

Ver Ejemplo: declarar propiedades y sintetizar accesores

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top