2009-07-07 5 views
0

Ich verwende NSMapTable in einem Programm, das unter 3.0 und 2.2.1 ausgeführt werden muss. Wie erwartet, stellt das Programm ohne Probleme für die 2.2.1 Bibliotheken, aber wenn ich auf 3.0 zu wechseln, bekomme ich Fehler Compiler:NSMapTable fehlt in 3.0-Headern?

error: expected specifier-qualifier-list before 'NSMapTable' 

Mit anderen Worten können XCode nicht die Deklaration der NSMapTable Klasse finden. Ich musste eine Vorwärtsdeklaration setzt in (@class NSMapTable) in meinem eigenen Kopf und

#import <Foundation/NSMapTable.h> 

in meiner Implementierung-Datei um in der Lage sein NSMapTable zu verwenden.

Irgendwelche Erklärungen dafür? Oder ist es nur ein Fehler, schlicht und einfach?

(Ich möchte darauf hinweisen, dass ich tun, natürlich, haben in der Header-Datei der Klasse #import die NSMapTable verwendet, müssen aber noch die spezifische Bedeutung.)

+3

Für alle, die versuchen würden, NSMapTable auf dem iPhone zu verwenden, ist hier eine schnelle und einfache Möglichkeit, sie durch ein Wörterbuch für einen einfachen Fall zu ersetzen (wo der Schlüssel NSCopying nicht entspricht). Statt: NSMapTable * mt = [NSMapTable mapTableWithWeakToWeakObjects]; [mt setObject: theObj forKey: theKey]; do: NSMutableDictionary * dict = [NSMutableDictionary WörterbuchWithCapacity: 100]; [dict setObject: theObj forKey: [NSValue valueWithNonretainedObject: theKey]]; – Felixyz

+0

Sie könnten auch CFMutableDictionary verwenden: CFDictionaryKeyCallBacks keyCallbacks = {0}; CFMutableDictionaryRef dict = CFDictionaryCreateMutable (NULL, 0, & keyCallbacks, & kCFTypeDictionaryValueCallBacks); CFDictionarySetValue (dict, Schlüssel, Wert); value = (id) CFDictionaryGetValue (dict, Schlüssel); – nanotech

Antwort

1

Ich glaube nicht, NSMapTable verfügbar war unter 2.2 für Apps, die für "Gerät" kompiliert wurden; Es war nur auf "Simulator" verfügbar. Da der Simulator von 3.0 eine genauere Darstellung des Geräts darstellt, ist dieser Header nicht mehr verfügbar. Glücklicherweise können Sie viel von dem tun, was eine NSMapTable mit einem NSDictionary und entsprechenden NSValue- oder NSNumber-Wrapper-Objekten um Schlüssel und Werte tun kann.

+0

Danke. Ein klares Zeichen dafür, dass ich beim Testen auf einem Gerät oft weniger träge sein sollte. Aber warum kompiliert es für 3.0-Simulator, wenn ich das Extra # include einlege? – Felixyz

+0

In Foundation/Foundation.h ist dieses Include in "#if (TARGET_OS_MAC &&! (TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))" eingeschlossen. Mit anderen Worten, es funktioniert, weil NSMapTable.h selbst nichts anzeigt, um anzuzeigen, dass es auf dem iPhone nicht verfügbar ist. –