1

値オブジェクトの弱参照を持つ変更可能な辞書を作成しようとしています(キーは正常に動作します)。 これは、私はそれをやろうとしている方法です:弱参照を持つNSMutableDictionary:CFRetainをコールバックとして使用する際の警告

+ (id)mutableDictionaryUsingWeakReferencesWithCapacity:(NSUInteger)capacity 
{ 
    CFDictionaryKeyCallBacks keyCallbacks = {0, CFRetain, CFRelease, CFCopyDescription, CFEqual, CFHash}; 
    CFDictionaryValueCallBacks valueCallbacks = {0, NULL, NULL, CFCopyDescription, CFEqual};  
    id<NSObject> obj = (id)(CFDictionaryCreateMutable(NULL, capacity, &keyCallbacks, &valueCallbacks)); 
    return [obj autorelease]; 
} 

残念ながら私はkeyCallbacksを宣言するときに警告(互換性のないポインタ型から初期化)を取得し、私はCFRetainを使用してそれを追跡してきたし、 CFRelease。

const void *MyCallBack (
    CFAllocatorRef allocator, 
    const void *value 
); 

しかし、既存のCFRetainが

として宣言されている:何らかの理由でこれらのコールバックは、それは例がCFDictionaryRetainCallbackは、次のようになりますと言っているドキュメントで必要なプロトタイプ(CFDictionaryRetainCallbackとCFDictionaryReleaseCallback)

と一致しません

CFTypeRef CFRetain(CFTypeRef cf); 

これはallocatorパラメータがないため、コンパイラが警告を出していると思います。つまり、関数のシグネチャには完全に一致しません。

誰もこのようなことをやろうとしましたか?

+0

私はiphoneに取り組んでいることを忘れてしまった。 –

答えて

1

が動作していないあなただけのデフォルトCFRetain/CFRelease行動をしたい場合、これは動作するはずです:

void MONDictionaryReleaseCallback(CFAllocatorRef allocator, const void* value) { 
#pragma unused(allocator) 
    assert(value); 
    if (0 != value) { 
     CFRelease(value); 
    } 
} 

保持コールバックはそこから簡単に実装する必要があります。

+0

助けてくれてありがとう! これは有効な解決策の1つです。また、以下のトピックで提案した他のものをチェックアウトすることもできます(kCFTypeDictionaryKeyCallBacks定数を使用)。 –

5

Do not Do That。 NSMapTableを使用してください。

+0

ニース:) NSMapTableについて知りませんでした。それは、弱い参照でトリックを行うようです。 –

+0

くそー! ...私はiPhoneで働いているとNSMapTableは利用できないと言及するのを忘れました。ごめんなさい。私の元の質問はまだ立っています。 –

+0

良いニュース!その後、NSMapTableがiOS 6に追加されました。 –

0

私は、手動でキーコールバックを宣言するのではなく、kCFTypeDictionaryKeyCallBacks定数を使用して動作させることができました。 コードは次のようになります。

id<NSObject> obj = (id)(CFDictionaryCreateMutable(NULL, capacity, &kCFTypeDictionaryKeyCallBacks, &valueCallbacks)); 

は、しかし、私はまだ好奇心、なぜ私の最初のコードは

+0

コールバックの構造体定義を見てから、それぞれの関数の定義を見てみましょう。彼らは 'CFRetain' /' CFRelease'よりも多くの引数を取る。デフォルトのCFTypeコールバックは、これらの関数の周りの薄いラッパーである可能性が高いです。 –

+0

@ケビン:私は私の元の投稿で言ったように、私はコールバックと関数のシグネチャが異なることに気づいた。定数kCFTypeDictionaryKeyCallBacksのドキュメントで次のように記述されているため、これがなぜか分かりませんでした。 _保持コールバックはCFRetain、リリースコールバックはCFRelease、コピーコールバックはCFCopyDescription、等価コールバックはCFEqual._ –

+0

です。これは、リテラル関数のポインタではなく、コールバックが何を実行するかを記述しています。 –

0

ランタイムで少しでも遊んでも構わない場合は、thisが私のプロジェクトで働いているものです(ATMで動作しますが、少しばかりです)。追加するオブジェクトの新しいサブクラスを動的に作成し、そのオブジェクトのクラスをサブクラスに設定します。サブクラスは、オブジェクトが割り当て解除されるたびに通知されるべきオブジェクトの配列を保持します。ディクショナリは、この配列に自身を追加して、割り当てが解除されたオブジェクトを削除できるようにします。

関連する問題