2009-07-07 10 views
0

3.0と2.2.1の両方で動作するプログラムでNSMapTableを使用しています。予想通り、プログラムは2.2.1ライブラリーの問題もなくコンパイルが、私は3.0に切り替えたとき、私はコンパイルエラーを取得:つまり3.0ヘッダーにNSMapTableがありませんか?

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

、XcodeはNSMapTableクラスの宣言を見つけることができません。私はNSMapTableを使用することができるようにするために、私自身のヘッダと私の実装ファイルで

#import <Foundation/NSMapTable.h> 

に(NSMapTable @class)前方宣言に入れていました。

これについての説明はありますか?それとも単なるバグか、単純でシンプルなのでしょうか?

(私は、もちろん、NSMapTableを使用するクラスのヘッダファイルに#IMPORT、まだ具体的なインポートを必要としているかということを指摘すべきである。)

+3

iPhone上でNSMapTableを使用しようとする人にとっては、簡単なケース(キーがNSCopyingに準拠していない場合)のための辞書で簡単に置き換えることができます。 の代わりに: NSMapTable * mt = [NSMapTable mapTableWithWeakToWeakObjects]; [mt setObject:theObj forKey:theKey]; do: NSMutableDictionary * dict = [NSMutableDictionary dictionaryWithCapacity:100]; [dict setObject:theObj forKey:[NSValue valueWithNonretainedObject:theKey]]; – Felixyz

+0

CFMutableDictionaryを使用することもできます。CFDictionaryKeyCallBacks keyCallbacks = {0}; CFMutableDictionaryRef dict = CFDictionaryCreateMutable(NULL、0、&keyCallbacks、&kCFTypeDictionaryValueCallBacks); CFDictionarySetValue(dict、key、value);値=(id)CFDictionaryGetValue(dict、key); – nanotech

答えて

1

を私はNSMapTableが利用可能であったとは思いません"Device"用にコンパイルされたアプリの場合は2.2で、それは「シミュレータ」でのみ利用可能でした。 3.0のシミュレータはデバイスのより正確な表現であるため、そのヘッダはもはや利用できません。幸いにも、あなたは、NSMapTableがNSDictionaryと適切なNSValueまたはNSNumberラッパーオブジェクトをキーと値の周りで行うことができることの多くを行うことができます。

+0

ありがとうございます。デバイスのテストを頻繁に行うのは怠惰ではないという明確な兆候です。しかし、#includeを追加すると3.0シミュレータ用にコンパイルされたのはなぜですか? – Felixyz

+0

Foundation/Foundation.hのインクルードは "#if(TARGET_OS_MAC &&!(TARGET_OS_EMBEDDED || TARGET_OS_IPHONE))"で囲まれています。言い換えれば、それはNSMapTable.h自体には何もないので、iPhone上で利用できないことを示しています。 –

関連する問題