ptr name inverso configurar objective-c variables ios5 properties automatic-ref-counting

objective-c - name - nslookup reverse



Problema semántico: el captador sintetizado de la propiedad sigue la convención de nomenclatura de Cocoa para devolver objetos ''propios'' (10)

Nombres de objetos inaceptables

  • nuevoBotón
  • copyLabel
  • allocTitle

Nombres de objetos aceptables

  • neueButton
  • mCopyLabel
  • _allocTitle

#arc # auto-sintetizado # xcode-4.6.1

** EDIT **

Aparentemente no puedes usar mutableCopy tampoco.

Actualmente estoy usando el iOS 5 SDK tratando de desarrollar mi aplicación. Estoy intentando convertir una propiedad NSString en una propiedad y luego sintetizarla en el archivo .m (lo he hecho antes sin problemas). Ahora, me encontré con esto: "Problema semántico: el captador sintetizado de la propiedad sigue la convención de nomenclatura de Cocoa para devolver objetos" de propiedad ".

Este es mi código: .h

@interface ViewController : UIViewController { NSString *newTitle; } @property (strong, nonatomic) NSString *newTitle;

.metro

@synthesize newTitle;

¿Alguien tiene una idea de cómo podría arreglar esto? ¡¡Gracias!!


ARC no permite usar "Nuevo ..." en el nombre de la propiedad. pero puedes usar "newTitle" cambiando el nombre del getter.

@property (nonatomic, strong, getter=theNewTitle) NSString *newTitle;


Además del problema que debe / no puede usar "nuevo" delante de sus nombres de propiedad, digamos una cosa más: intente evitar "nuevo" delante de los nombres en general. "Nuevo" depende del tiempo. Actualmente es nuevo para usted, pero algún tiempo después tal vez quiera implementar algo nuevo nuevamente. Así que usar "nuevo" en los nombres siempre es malo. Intenta 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, a continuación, el nombre actual de su propiedad, Título de reemplazo.

Una cosa más: intente nombrar funciones y métodos con el verbo primero, como setSomething o getSomething. Pero en propiedades, primero debe nombrar el objeto, como heightMinimum, heightMaximum, etc. -> cuando usa su inspector cuando está codificando, siempre está buscando objetos. Pruébalo. ;-)


El nombre del miembro que comienza con new es lo que activa la advertencia. Cambie el nombre a editedTitle y la advertencia desaparecerá. No pude encontrar documentación que confirme esto, pero a través de las pruebas fue capaz de determinar que las variables miembro que comienzan con ''nuevo'' agravan el compilador.


En CoreData, si usa "nuevo ..." en el atributo (compilar normalmente) se bloqueará aleatoriamente con una excepción de "acceso incorrecto".

No hay registro de fallos 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 mismo nombre que la propiedad eliminó esta advertencia.


No parece que lo que Bavarious estaba sugiriendo era lo que querías hacer. Todo lo que desea hacer es declarar una variable de instancia NewTitle y luego sintetizar 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, es muy fácil cometer errores .

Ver ejemplo: Declarar propiedades y sintetizar accesores


Supongo que la versión del compilador que está utilizando sigue las reglas de administración de memoria para las propiedades declaradas, más específicamente, para los accesores de propiedades declaradas:

Usted es el propietario de un objeto si lo crea con un método cuyo nombre comience con "alloc", "new", "copy" o "mutableCopy".

Una propiedad llamada 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 propiedad newTitle , sin embargo, las convenciones de nomenclatura establecen que un método cuyo nombre comience con new devuelve un objeto que es propiedad del llamante, que no es el caso de los métodos getter.

Puedes resolver esto por:

  1. Renombrando esa propiedad:

    @property (strong, nonatomic) NSString *theNewTitle;

  2. Mantener el nombre de la propiedad y especificar un nombre de captador que no comience con uno de los prefijos de nombres de métodos especiales:

    @property (strong, nonatomic, getter=theNewTitle) NSString *newTitle;

  3. Mantener tanto el nombre de la propiedad como el nombre del captador, y decirle al compilador que, aunque el nombre del iniciador comience con new , pertenece a la familia de métodos none en lugar de a la familia de métodos new :

    #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 como el nombre de la propiedad como el nombre del adquirente, tener un método llamado -newTitle que no devuelve un objeto 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 la versión ARC , en las que se indica:

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 muy precisa: el culpable es el nombre del método getter, no el nombre de la propiedad.

Ed. 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 fix-it, para el caso general donde un nombre de propiedad coincide con uno de los prefijos de familias de métodos especiales . Xcode probablemente incorporará este cambio eventualmente.


prueba esto:-

@property (nonatomic,retain) NSString *newTitle;


NS_RETURNS_NOT_RETAINED se utiliza para resolver el problema de nombres.

@property (nonatomic, copy) NSString *newTitle NS_RETURNS_NOT_RETAINED;

Podemos encontrar su definition siguiente manera,

#define NS_RETURNS_NOT_RETAINED __attribute__((ns_returns_not_retained))

El atributo ''ns_returns_not_retained'' es el complemento de ''ns_returns_retained''. Cuando una función o un método parezca obedecer las convenciones de Cocoa y devolver un objeto Cocoa retenido, este atributo puede usarse para indicar que la referencia de objeto devuelta no debe considerarse como una referencia "propietaria" que se devuelve al llamante. El marco de Foundation define una macro NS_RETURNS_NOT_RETAINED que es funcionalmente equivalente a la que se muestra a continuación.

Adjunte más detalles aquí.