iphone - освобождение CFDictionary - PullRequest
0 голосов
/ 04 августа 2010

Я не знаком с C. У меня есть метод, созданный кем-то еще, у которого есть CFDicionary, который был создан как это

touchBeginPoints = CFDictionaryCreateMutable(NULL, 0, NULL, NULL);

point = (CGPoint *)malloc(sizeof(CGPoint));
CFDictionarySetValue(touchBeginPoints, touch, point);

Я бы хотел освободить словарь. Насколько я понимаю, мне нужно переходить по пунктам на любое количество записей в словаре и освобождать каждую из них.

что-то вроде

        free((void *)CFDictionaryGetValue(touchBeginPoints, ...));
        CFDictionaryRemoveValue(touchBeginPoints, ...);

Итак, как мне пройти по этому CFDictionary, освобождая каждую сохраненную там точку и удаляя каждую словарную запись?

спасибо за любую помощь.

Ответы [ 3 ]

3 голосов
/ 04 августа 2010

Вы не делаете.

Вы читаете эту страницу: http://developer.apple.com/mac/library/documentation/CoreFoundation/Reference/CFDictionaryRef/Reference/reference.html#//apple_ref/doc/c_ref/CFDictionaryValueCallBacks

Вы понимаете, что по умолчанию стандартный словарь будет вызывать CFRetain () для удержания переданного вами значенияэто, и CFRelease (), чтобы отпустить это.Вы думаете "... но CFRetain () не подходит для вызова против CGPoint".Вы понимаете, что все те люди, которые сказали вам просто выпустить словарь, будут в лучшем случае протекать, а в худшем - падать.

Затем вы создаете структуру, подобную этой:

CFDictionaryValueCallBacks myValueCallbacks = {
  0,
  NULL,
  myRelease,
  NULL,
  NULL
};

, и передаете еев качестве аргумента valueCallbacks при создании словаря (последний аргумент).Функция myRelease должна выглядеть следующим образом:

void myRelease ( CFAllocatorRef allocator, const void *value )
{
    free(value);
}

Теперь, когда словарь публикует значения, он вызывает для них free ().

Сказав все это, если выВы новичок в C, это не то место, с которого нужно начинать.

0 голосов
/ 04 августа 2010

Нет необходимости перебирать его, просто отпустите его с помощью функции CFRelease.Для получения более подробной информации и информации обратитесь к Руководству по программированию управления памятью для Core Foundation в iPhone Dev Center.

В вашем случае:

CFRelease(touchBeginPoints);
0 голосов
/ 04 августа 2010

Вы можете использовать бесплатный мост Objective-C между CFDictionary и NSDictionary, если хотите:

[(id)touchBeginPoints release]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...