2009-07-20 7 views
13

Hay dos tiempos de ejecución para Cocoa/Objective-C: el tiempo de ejecución heredado y el tiempo de ejecución "moderno" (así es como Apple lo llama).iPhone Simulator: errores de compilación al usar variables de instancia sintetizadas

Según Apple's documentation, "aplicaciones para el iPhone y los programas de 64 bits en Mac OS X v10.5 y después utilizar la versión moderna del tiempo de ejecución".

Hasta ahora todo bien.

Ahora, el tiempo de ejecución "moderno" admite una característica llamada "variables de instancia sintetizadas", lo que significa que no tiene que definir una variable de instancia para cada propiedad declarada. La variable de instancia se agregará automáticamente. Presupuesto de la iPhone Reference Library: ". Para los tiempos de ejecución modernas, las variables de instancia se sintetizan según sea necesario Si una variable de instancia del mismo nombre ya existe, se utiliza"

Si se utiliza esta función en su aplicación para el iPhone, construye y funciona bien en el dispositivo iPhone (físico), pero cuando cambia el objetivo a "iPhone Simulator", obtiene errores de compilación:

propiedad sintetizada 'x' debe ser nombrado igual que un ivar compatible o debe nombrar explícitamente un ivar

¿Qué está pasando aquí? ¿No es el simulador de iPhone un verdadero simulador de iPhone? ¿Esto significa que el simulador usa un tiempo de ejecución diferente al del iPhone físico?

¿Cómo puedo usar esta característica en el simulador de iPhone?

EDIT:

El código que no se compila cuando la orientación del iPhone Simulator es:

@interface MyClass : NSObject { 
} 

@property NSString *prop1; 

@end 

Según la documentación, esto debería funcionar bien en el tiempo de ejecución "moderna" , y de hecho lo hace en el dispositivo iPhone, pero no se compila al cambiar el objetivo a iPhone Simulator.

Respuesta

15

El simulador de iPhone en los SDK actuales (3.0) usa el tiempo de ejecución del host, que no admite ivars sintetizados en modo de 32 bits. Tendrás que @synthesize tus ivars hasta que se arregle el simulador. (Sería bueno presentar un error con Apple solicitando esta mejora.)

+2

Esto es correcto - es un error en el simulador actual. Hubo un tema SO sobre esto (que no puedo encontrar, tal vez fue un hilo cocoa-dev), y también esto: http://iphonedevelopment.blogspot.com/2009/06/runtime-madness.html –

+0

@ Daniel: Vale la pena publicar este comentario como respuesta –

+1

Creo que esto fue corregido en el SDK 4.0 o 4.1. –

4

Debe tener una variable para 'respaldar' la propiedad sintetizada, a menos que tenga planeado implementar la propiedad usted mismo.

La forma más sencilla de solucionar su código es añadir una variable de instancia:

@interface MyClass : NSObject { 
NSString * prop1; 
} 

@property NSString *prop1; 

@end 
+1

Lo sé, pero esa no es realmente una respuesta a mi pregunta. No explica por qué una característica que funciona en el dispositivo iPhone no funciona en el simulador. No tener que "respaldar" la propiedad es una característica del tiempo de ejecución "moderno", compatible con el iPhone. –

+0

Encuentro que, de hecho, no necesito definir la variable de instancia de respaldo después de definir la propiedad, y la aplicación funciona bien. ¿Cuál es la historia aquí? Es la variable de instancia necesaria, o no? –

+0

que solucionó mi problema! Gracias :) – ExceptionSlayer

Cuestiones relacionadas