Использование массива C в качестве свойства
Мне нужно объявить свойство для массива C пользовательского типа структуры.
Может кто-нибудь объяснить, что я должен делать с этим массивом C, насколько объявления свойств? Разве я не должен использовать объявление свойства вообще?
Я старался memset()
памяти в массиве, и потерпел неудачу с ошибкой компиляции. Может кто-нибудь это объяснить?
3 ответа
Этот ответ на самом деле не решает вашу проблему, он просто объясняет, почему ваш подход не сработал.
В C вы не можете возвращать типы массивов из функций. Это просто ограничение языка (преднамеренное или непреднамеренное, я не знаю). В Objective-C вы не можете возвращать типы массивов из методов. Это также означает, что вы не можете использовать типы массивов в качестве свойств, потому что компилятор не может synthesize
метод, который возвращает тип массива.
Массивы C автоматически преобразуются в типы указателей при использовании в выражении, поэтому вы можете следовать советам @Graham и использовать вместо них указатели. Недостатком этого подхода является то, что вы должны точно знать, сколько элементов в массиве, чтобы вы случайно не прочитали его конец. Если количество элементов фиксировано и известно во время компиляции, это, вероятно, путь (если вы хотите избежать NSArray
для любой причины).
Сложно ответить почемуmemset
не удалось скомпилировать, фактически не увидев, как вы его использовали, но, вообще говоря, вот как это можно использовать:
MyStruct someStructs[10];
memset(someStructs, 0, sizeof someStructs);
В качестве альтернативы, можно возвращать структуры из функций / методов, даже если они содержат массивы. Теоретически, вы можете создать структуру, содержащую массив MyStruct
и использовать этот новый тип структуры в качестве типа свойства. С практической точки зрения это не очень хорошая идея, поскольку она просто добавляет уровень сложности.
Если у вас есть это:
@interface MyClass
{
struct MyStruct foo[5];
}
@end
Вы не можете иметь свойство чтения / записи вообще. Вы можете объявить свойство только для чтения
@property (readonly, assign) struct MyStruct* fooProperty;
который даст вам указатель на массив. Тем не менее, это, вероятно, плохо, так как он предоставляет остальной части вашего кода внутренний доступ к структуре MyClass. Вероятно, лучше реализовать индексированные средства доступа KVC, что вам придется делать вручную.
Вы, конечно, можете обращаться с массивом как со свойством, у него будет поведение "назначить", потому что вы не можете сохранить структуру. По сути, вы все еще несете полную ответственность за распределение памяти в массиве.
Другой вариант - заменить структуру на объект. Затем он более естественно работает с механизмом свойств и открывает для вас классы коллекции Foundation, такие как NSArray.