2010-07-19 3 views
3

В ситуации, когда мне нужно сохранить все элементы данных в NSDictionary, имеет ли смысл вкладывать в мою собственную оболочку структуры (пользовательские типы или даже скаляры, то есть CGPoint) NSValue), поэтому я могу избежать накладных расходов на кодирование/декодирование каждый раз, когда я получаю или устанавливаю член?Производительность - структуры в объекте NSValue и контейнере

Для больших структур (16 поплавков) экономия значительна для ИМО. Но даже с CGPoint я бы сохранил 4 байта копирования, а также время кодирования/декодирования.

ответ

3

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

Если оба варианта не является достаточной вы можете посмотреть в CFDictionary с указателями на равнинные структуры, установив value callbacks соответственно или взять C++ std::map/std::tr1::unordered_map на спину (если вы не против смешивания в C++, что есть).

+1

CFDictionary может быть ответом. – Morrowless

1

Ну, типы NSDictionary требуют в любом случае объектов как их членов, поэтому вы не можете хранить структуру в NSDictionary. Вам придется обернуть его в контейнерный объект.

+0

Да, но мой выбор между NSValue и простым контейнерным объектом. – Morrowless

3

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