без подсчета ссылок словарь в target-c - PullRequest
5 голосов
/ 15 июня 2010

Есть ли какой-нибудь "простой" способ иметь чистые контейнеры target-c, такие как NSMutableDictionary или CFMutableDictionary, которые не увеличивают счетчик ссылок добавленных объектов, без использования стандартной библиотеки c ++?

РЕДАКТИРОВАТЬ: Объяснение - причина, по которой я этого хочу, заключается в том, чтобы я мог реализовать своего рода шаблон «Точно один» - у класса будет статический метод имени getThing: (NSString *). Если этот метод находит Thing, связанный с именем в некоторой статической структуре данных (словарь без подсчета ссылок), он возвращает его, в противном случае он создает его, добавляет его в структуру под этим именем и возвращает его. Этот объект Thing может быть сохранен клиентом по желанию, но когда его счетчик ссылок падает до 0 (и вызывается dealloc), его следует удалить из словаря. Таким образом, я не могу освободить его при добавлении и сохранить его снова при удалении - dealloc будет вызван снова, и я не хочу этого. Вот почему мне нужен словарь без приращений. Если есть другой способ получить то, что я хочу, пожалуйста, дайте мне знать, хотя я уверен, что проверенный ответ дает мне то, что я хочу. Спасибо!

Ответы [ 4 ]

3 голосов
/ 15 июня 2010

Если вы разрабатываете для MacOSX, вы можете использовать NSMapTable .Посмотрите эту запись в блоге Майка Эша , чтобы узнать больше об этом.

Если вы разрабатываете для iPhone, вы можете использовать CFMutableDictionary с пользовательскими структурами обратного вызова:

  • скопируйте структуры kCFTypeDictionaryKeyCallBacks и kCFTypeDictionaryValueCallBacks в новые.
  • поместите поля retain и release в NULL, где вам не нужно сохранять / освобождать(ключ и / или значения).
  • передают структуры при вызове CFDictionaryCreateMutable.

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

1 голос
/ 15 июня 2010

Вы можете создать NSValue, представляющий каждый объект с помощью метода valueWithPointer:.Вместо этого добавление значений в коллекцию не приведет к сохранению ссылочного объекта.Это довольно грубо, поэтому подумайте, не может ли быть лучшего способа достичь вашей цели, чем обходить владение контейнером содержащихся объектов.

1 голос
/ 15 июня 2010

Зачем вам нужен контейнер для подсчета без ссылок?Если вы храните обычные значения (например, целые числа), вы можете обернуть их в тип NSValue и если у вас есть какой-то другой тип, но вам не нужно такое количество ссылок, просто вызовите «release»сразу после добавления в контейнер.

0 голосов
/ 15 июня 2010

Если в Mac OS X, используйте NSMapTable.

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