0

AddressBook でいくつかのテストを行っています。探しているデータを取得できますが、それがどのように配信されるのか気になります。具体的には CFDictionaryRef です。これを NSDictionary にキャストしてコンソールにログを記録すると、キー = 値のペアではなく、文字列値が取得されます。allKeys をログに記録しようとすると、テスト アプリが壊れます。

私が使用しているコードスニペットは次のとおりです。

if ([contactName isEqualToString:ownerName]) { 

                    //get reference to  their email addresses
                    ABMultiValueRef contactEmails = ABRecordCopyValue(thisPerson, kABPersonEmailProperty);

                    //loop
                    for (NSUInteger e = 0; e < ABMultiValueGetCount(contactEmails); e++){

                        CFDictionaryRef thisPersonCFEmailDict = ABMultiValueCopyValueAtIndex(contactEmails, e);
                        NSDictionary* thisPersonEmailDict = (__bridge NSDictionary*)thisPersonCFEmailDict;

                        NSLog(@"%@", [thisPersonEmailDict allKeys]);

                    }

                }
4

2 に答える 2

1

CFDictionaryRef は、NSDictionary に対応する Core Foundation です。NSDictionary と CFDictionary は「無料でブリッジ」されるため、コード内の NSDictionary オブジェクトを CFDictionary オブジェクトに置き換えることができます (適切なキャストを使用)。それらは対応する型ですが、CFDictionary と NSDictionary は同一のインターフェイスまたは実装を持ってません。フリーダイヤル ブリッジングとは、Core Foundation 関数呼び出しのパラメーターとして、または Objective-C メッセージの受信者として、同じデータ型を使用できることを意味します。

于 2013-02-06T19:13:55.697 に答える
1

ABMultiValueCopyValueAtIndex()を返すと仮定していますCFDictionaryRef。そうではありません。戻り値によって証明されるように、その複数値に適した値をCFTypeRef返します。

ABMultiValueGetPropertyType()特定の複数値レコードが持つ値のタイプを調べるために使用できます。それが返された場合、kABDictionaryPropertyTypeそれは辞書であることがわかりますが、あなたの場合はおそらく返されていますkABStringPropertyType。を返すこともできkABInvalidPropertyTypeます。これは、複数値に異なる型が含まれていることを示している可能性があります。CFGetTypeID()その場合は、 から返される値の型を識別するために を使用する必要がありますABMultiValueCopyValueAtIndex()

于 2013-02-06T19:10:23.290 に答える