Actualmente estoy usando el SDK de iOS 5 tratando de desarrollar mi aplicación. Estoy tratando de hacer que un NSString sea una propiedad, y luego sintetizarlo 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 'propios'".
Este es mi código: .h
@interface ViewController : UIViewController {
NSString *newTitle;
}
@property (strong, nonatomic) NSString *newTitle;
.metro
@synthesize newTitle;
¿Alguien tiene idea de cómo podría solucionar esto? ¡¡Gracias!!
Respuestas:
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:
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 lanewTitle
propiedad, sin embargo, las convenciones de nomenclatura establecen que un método cuyo nombre comienza connew
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:
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:
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 lanone
familia de métodos en lugar de a lanew
familia de métodos: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:
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.fuente
NS_RETURNS_NOT_RETAINED
es lo que necesitas también.Nombres de objetos inaceptables
Nombres de objetos aceptables
#arc # auto-sintetizado # xcode-4.6.1
** EDITAR **
Aparentemente tampoco puedes usar mutableCopy .
fuente
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 lo confirme, pero a través de las pruebas pude determinar que las variables miembro que comienzan con 'nuevo' agravan el compilador.
fuente
ARC no permite usar "Nuevo ..." en el nombre de la propiedad. pero puede usar "newTitle" cambiando el nombre del captador.
fuente
No parece que Bavarious sugiriera que era lo que querías hacer. Todo lo que quiere 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 hacerlo es la siguiente:
.h
.metro
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 para cometer errores .Ver ejemplo: Declarar propiedades y sintetizar accesorios
fuente
NS_RETURNS_NOT_RETAINED
es lo que necesitasEn CoreData si usa "nuevo ..." en el atributo (compilar normalmente) se bloqueará aleatoriamente con una excepción de "mal acceso".
No hay registro de fallas y la línea que se muestra con el "Punto de interrupción de todas las excepciones" no lo ayudará en absoluto.
fuente
Escribir un setter manualmente con el mismo nombre que la propiedad ha eliminado esta advertencia.
fuente
Además del problema de que debe / no puede usar "nuevo" delante de sus nombres de propiedad, digamos una cosa más: trate de 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. Por lo tanto, 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, entonces el nombre actual de su título de propiedad Reemplazo.
Una cosa más: primero intente nombrar funciones y métodos con el verbo, como setSomething o getSomething. 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. ;-)
fuente
NS_RETURNS_NOT_RETAINED
se usa para resolver el problema de nombres.Podemos encontrar su definición de la siguiente manera,
Adjunte más detalles aquí.
fuente
prueba esto:-
fuente