2012-01-16 8 views
3

キーチェーンのサービスコードを簡略化し、CFDictionarySetValueと財団のNSStringを使用したいと思います。 CFDictionarySetValueCoreFoundation関数でFoundationのNSStringを正しく使うにはどうすればいいですか?

宣言はそのようになります:私は、例えば渡すとき

void CFDictionarySetValue(CFMutableDictionaryRef theDict, const void *key, const void *value) 

ので、何が起こりますvalue@"This is a NSString"パラメータ?私のケースでは、コンパイラは警告も静的解析も何も検出しません。実行時にはクラッシュはないので、実行時にすべてが処理されるか、[@"something" cStringUsingEncoding:NSUTF8StringEncoding]を渡してconst void*にキャストする必要がありますか?

NSLog(@"%s", CFDictionaryGetValue(query, kKeyForCStringInUTF8)); 
NSLog(@"%@", CFDictionaryGetValue(query, kKeyForNSString)); 

両方が同じ出力を与える:

私の調査結果は、ことを示しています!混乱しています...

CFとFoundationの間でオブジェクトを交換する際の一般的なルールは何ですか?一般的に受け入れられているコードスタイル、良い習慣がありますか?

+0

を、私は、コードを「簡素化」しないことを決定しました私が上で示唆したように。オブジェクトの相互運用性が問題なので、NSMutableDictionaryに固執することができます。 – matm

答えて

3

NSStringであり、他のタイプは、CoreFoundationの同等物にフリーダイヤルでブリッジされています。
Core Foundation Design Concepts - Toll-Free Bridged Typesを参照してください:

Core Foundationのフレームワークにおけるデータの種類の数と交換可能に使用することができるFoundationフレームワークがあります。つまり、Core Foundation関数呼び出しの引数として、またはObjective-Cメッセージ呼び出しの受信者と同じデータ構造を使用できます。

+0

私はこれがdocsによってカバーされてうれしいです:)この文書を持って来てくれてありがとう:) – matm

1

私は正確に何を求めているのかよくわからないので、私はゲオルグの答えを広げようとしています。私はあなたがCFMutableDictionaryRefが必要だと仮定していますが、まだMSMutableDictionaryを使用することができます。これがあなたの質問に対する答えでない場合は、私に知らせてください。

私があなたの場合は、単にNSMutableDictionaryを代わりに使用するので、単に[yourDictionary setValue:yourString forKey:@"yourKey"];を使用してください。 1つのパラメータを削除します。値を設定および取得するために、それでは

CFMutableDictionaryRef cfDictionary = (CFMutableDictionaryRef) yourDictionary; 

、あなたはこの行うことができます:あなたがCFMutableDictionaryRefが必要な場合は、ちょうどこのコードを使用するまあ

// Make the objects somewhere 
NSString *yourString = @"something"; 
NSMutableDictionary *yourDictionary = [[NSMutableDictionary alloc] init]; 

// now set the value... 
[dictionary setObject:yourString forKey:@"Anything at all"]; 

// and to get the value... 
NSString *value = [yourDictionary valueForKey:@"Anything at all"]; 

// now you can show it 
NSLog(@"%@", value); 
+0

私の場合、私はあなたが 'CFMutableDictionaryRef'と 'CFDictionarySetValue'で提案した' NSMutableDictionary'操作を正確に置き換えたいと思っています。私はコードの可読性とコンパクト性を向上させるでしょうが、私はいくつかの人々にとっては複雑さが増していくことを承知しています...貢献してくれてありがとう! – matm

関連する問題