2009-07-20 7 views
13

Ci sono due runtime per Cocoa/Objective-C: il runtime legacy e il runtime "moderno" (questo è ciò che Apple chiama).Simulatore iPhone: genera errori quando si usano variabili di istanza sintetizzate

Secondo Apple's documentation, "Applicazioni iPhone e programmi a 64 bit su Mac OS X v10.5 e versioni successive utilizzano la versione moderna del runtime".

Fin qui tutto bene.

Ora il runtime "moderno" supporta una funzionalità denominata "variabili di istanza sintetizzate", il che significa che non è necessario definire una variabile di istanza per ogni proprietà dichiarata. La variabile di istanza verrà aggiunta automaticamente. Citazione dal iPhone Reference Library: ". Per i tempi di esecuzione moderni, le variabili di istanza sono sintetizzati in base alle esigenze Se una variabile con lo stesso nome istanza esiste già, è utilizzato"

Se si utilizza questa funzione nel vostro iPhone app, costruisce e funziona bene sul dispositivo iPhone (fisico), ma quando si cambia l'obiettivo su "iPhone Simulator", si verificano errori di compilazione:

proprietà sintetizzata 'x' deve essere denominata come un ivar compatibile o deve nominare esplicitamente un ivar

Cosa sta succedendo qui? Il simulatore di iPhone non è un vero simulatore di iPhone? Questo significa che il simulatore utilizza un tempo di esecuzione diverso rispetto all'iPhone fisico?

Come posso utilizzare questa funzione sul simulatore iPhone?

EDIT:

Il codice che non compilare quando si mira il Simulatore iPhone è:

@interface MyClass : NSObject { 
} 

@property NSString *prop1; 

@end 

In base alla documentazione, questo dovrebbe funzionare bene sul runtime "moderna" , e in effetti lo fa sul dispositivo iPhone, ma non viene compilato quando si cambia il target su iPhone Simulator.

risposta

15

iPhone Simulator negli attuali SDK (3.0) utilizza il runtime dell'host, che non supporta gli ivars sintetizzati in modalità a 32 bit. Dovrai @synthesize i tuoi ivars fino a quando il Simulatore non verrà riparato. (Sarebbe opportuno presentare un bug con Apple che richiede questo miglioramento.)

+2

Questo è corretto - è un bug nel simulatore corrente. C'era un SO argomento su questo (che non riesco a trovare - forse era un thread cocoa-dev), e anche questo: http://iphonedevelopment.blogspot.com/2009/06/runtime-madness.html –

+0

@ Daniel: questo commento vale la pena di essere ripubblicato come risposta –

+1

Credo sia stato corretto nell'SDK 4.0 o 4.1. –

4

È necessario disporre di una variabile per "eseguire il backup" della proprietà sintetizzata, a meno che non si preveda di implementare la proprietà da soli.

Il modo più semplice per risolvere il codice è quello di aggiungere una variabile di istanza:

@interface MyClass : NSObject { 
NSString * prop1; 
} 

@property NSString *prop1; 

@end 
+1

Lo so, ma non è davvero una risposta alla mia domanda. Non spiega perché una funzione che funziona sul dispositivo iPhone non funzioni nel simulatore. Non dover "eseguire il backup" della proprietà è una funzionalità del runtime "moderno", supportato dall'iPhone. –

+0

Trovo che I -don't- in realtà bisogno di definire la variabile di istanza di backup dopo aver definito la proprietà, e l'app funziona bene. Qual è la storia qui? La variabile di istanza è necessaria o no? –

+0

che ha risolto il mio problema! Grazie :) – ExceptionSlayer