Как мне справиться со сложной последовательностью Multi-Touch? - PullRequest
2 голосов
/ 14 декабря 2009

Пример кода «Обработка сложной последовательности Multi-Touch» в разделе «Обработка событий» Руководства по программированию приложений iPhone содержит неполный пример, предполагающий, что читатель знает достаточно для заполнения пробелов. Я знаю достаточно, чтобы знать, что не знаю достаточно, чтобы сделать это без каких-либо разъяснений.

В листинге 3-6 я предполагаю, что touchBeginPoints является свойством типа CFDictionaryRef. Правильно?

В этом же примере мы используем malloc(), поэтому я предполагаю, что нам нужно позвонить free() в более поздний момент. Мой вопрос: что я освобождаю и когда? Должен ли я free() отдельные баллы в touchesEnded: / touchesCancelled:? Как бы я это сделал? (Я предполагаю, что мне нужно прочитать перечисление CFDictionaryRef) Или я бы free(touchBeginPoints); в своем методе dealloc:?

Наконец, в листинге 3-7 есть метод compareAddress:. Как (и где) я бы это реализовал?

Обновление Найден ответ на последний.

1 Ответ

1 голос
/ 14 декабря 2009
  • Да, touchBeginPoints - это свойство члена типа CFDictionaryRef.
  • Вы бы не вызывали free на экземпляре CFDictionaryRef, а скорее на CFRelease. (Управление памятью в CoreFoundation аналогично Objective-C с явным подсчетом ссылок через семантику сохранения / выпуска.)
  • Возможно, вы захотите прочитать «Темы программирования коллекций для Core Foundation», чтобы лучше понять CFMutableDictionary. http://developer.apple.com/mac/library/documentation/CoreFoundation/Conceptual/CFCollections/CFCollections.html
  • Что касается free ключей, вы, вероятно, захотите передать обратный вызов настраиваемого выпуска при создании словаря. Обратный вызов освобождения ключа вызывается для каждого элемента в словаре при его освобождении. (См. Последние два параметра для CFMutableDictionaryCreate для получения дополнительной информации.)

compareAddress: будет выглядеть примерно так:

 @interface UITouch (TouchSorting)
 - (NSComparisonResult)compareAddress:(id)obj;
 @end

 @implementation UITouch (TouchSorting)
 - (NSComparisonResult)compareAddress:(id)obj {
     if ((void *)self < (void *)obj) return NSOrderedAscending;
    else if ((void *)self == (void *)obj) return NSOrderedSame;
    else return NSOrderedDescending;
 }
 @end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...