Как обрабатывать массив указателей в Objective-C - PullRequest
3 голосов
/ 17 мая 2010

Я разобрался с ответом на этот вопрос, но не смог найти здесь решения, поэтому разместил его для потомков.

Итак, как в Objective-C как создать объект из указателя, чтобы сохранить его в коллекциях target-c (NSArray, NSDictionary, NSSet и т. Д.), Не возвращаясь к обычному C?

Ответы [ 2 ]

8 голосов
/ 17 мая 2010
NSValue *pointerObject = [NSValue valueWithPointer:aPointer];

Это обернет указатель в NSValue. Чтобы вернуть его позже, используйте метод экземпляра NSValue (pointerValue:)

1 голос
/ 17 мая 2010

Альтернативное решение состоит в том, чтобы определить класс, который имеет методы, которые обращаются к содержимому указателя / манипулируют им, а затем добавляют экземпляры этого в массив.

Не беспокойтесь о создании подкласса NSValue, поскольку он действительно ничего не добавляет к решению.

Что-то вроде:

@interface FooPtr:NSObject
{
    void *foo;
}

+ fooPtrWithFoo: (void *) aFoo;

.... methods here ...
@end

Я специально выбрал непрозрачный (void *), так как он говорит клиенту "не трогай мои внутренности напрямую". В реализации сделайте что-то вроде #define FOOPTR(foo) ((Foo *) foo) Затем вы можете FOOPTR(foo)->bar;, как вам нужно в ваших различных методах.

Выполнение этого также упрощает добавление логики, специфичной для Objective C, поверх базового типа данных. Сортировка - это всего лишь вопрос реализации правильного метода. Хеширование / словарные записи теперь можно хэшировать на содержимом foo и т. Д. *

...