2009-07-20 8 views
13

Es gibt zwei Laufzeiten für Cocoa/Objective-C: die Legacy-Laufzeit und die "moderne" Laufzeit (so nennt Apple es).iPhone Simulator: Build Fehler bei der Verwendung synthetisierter Instanz Variablen

Gemäß Apple's documentation "iPhone-Anwendungen und 64-Bit-Programme auf Mac OS X 10.5 und höher verwenden Sie die moderne Version der Laufzeit".

So weit so gut.

Jetzt unterstützt die "moderne" Laufzeit eine Funktion namens "synthetisierte Instanzvariablen", was bedeutet, dass Sie für jede deklarierte Eigenschaft keine Instanzvariable definieren müssen. Die Instanzvariable wird automatisch hinzugefügt. Zitat aus den iPhone Reference Library: „. Für die modernen Runtimes werden Instanzvariablen synthetisiert nach Bedarf Wenn eine Instanzvariable mit dem gleichen Namen bereits vorhanden ist, es verwendet wird

Wenn Sie diese Funktion in Ihrem iPhone App verwenden, Es baut und läuft gut auf dem iPhone (physischen) Gerät, aber wenn Sie das Ziel auf "iPhone Simulator" ändern, erhalten Sie Build-Fehler:

synthetisierte Eigenschaft 'x' muss entweder die gleiche wie eine kompatible ivar benannt werden oder muss explizit einen ivar benennen

Was ist hier los? Ist der iPhone Simulator kein echter iPhone Simulator? Bedeutet dies, dass der Simulator eine andere Laufzeit als das physische iPhone verwendet?

Wie kann ich diese Funktion auf dem iPhone-Simulator verwenden?

EDIT:

Der Code, der nicht kompiliert, wenn das iPhone Simulator Targeting:

@interface MyClass : NSObject { 
} 

@property NSString *prop1; 

@end 

Gemäß der Dokumentation, sollte dies gut funktionieren auf der "modernen" Laufzeit und zwar auf dem iPhone-Gerät, aber es kompiliert nicht, wenn das Ziel auf iPhone Simulator geändert wird.

Antwort

15

Der iPhone-Simulator in aktuellen SDKs (3.0) verwendet die Laufzeit des Hosts, die keine synthetisierten Ivars im 32-Bit-Modus unterstützt. Sie müssen @synthesize Ihre Ivars bis der Simulator behoben ist. (Es wäre gut, einen Fehler bei Apple einzureichen, der diese Verbesserung anfordert.)

+2

Das ist richtig - es ist ein Fehler in dem aktuellen Simulator. Es gab ein SO-Thema dazu (das ich nicht finden kann - vielleicht war es ein Kakao-Dev-Thread), und auch das: http://iphonedevelopment.blogspot.com/2009/06/runtime-madness.html –

+0

@ Daniel: Dieser Kommentar ist es wert, als Antwort zurückgegeben zu werden –

+1

Ich glaube, das wurde in der 4.0 oder 4.1 SDK behoben. –

4

Sie müssen eine Variable haben, um die synthetisierte Eigenschaft zu sichern, es sei denn, Sie planen die Implementierung der Eigenschaft selbst.

Der einfachste Weg, Ihren Code zu beheben, ist eine Instanz Variable hinzuzufügen:

@interface MyClass : NSObject { 
NSString * prop1; 
} 

@property NSString *prop1; 

@end 
+1

Ich weiß das, aber das ist nicht wirklich eine Antwort auf meine Frage. Es erklärt nicht, warum eine Funktion, die auf dem iPhone-Gerät funktioniert, nicht im Simulator funktioniert. Die "moderne" Laufzeit, die vom iPhone unterstützt wird, muss nicht "gesichert" werden. –

+0

Ich finde, dass ich nicht wirklich die Backing-Instanz-Variable nach der Definition der Eigenschaft definieren muss, und die App funktioniert gut. Was ist die Geschichte hier? Wird die Instanzvariable benötigt oder nicht? –

+0

das mein Problem behoben! Vielen Dank :) – ExceptionSlayer

Verwandte Themen