Использование массива C в качестве свойства - PullRequest
1 голос
/ 25 октября 2010

Мне нужно объявить свойство для массива C пользовательского типа структуры.

Может кто-нибудь объяснить, что я должен делать с этим массивом C, до объявления свойств? Разве я не должен использовать объявление свойства вообще?

Я попытался memset() памяти в массиве, и потерпел неудачу с ошибкой компиляции. Кто-нибудь может это объяснить?

Ответы [ 3 ]

2 голосов
/ 25 октября 2010

Этот ответ на самом деле не решает вашу проблему, он просто объясняет, почему ваш подход не работает.

В C вы не можете возвращать типы массивов из функций.Это просто ограничение языка (преднамеренное или непреднамеренное, я не знаю).В Objective-C вы не можете возвращать типы массивов из методов.Это также означает, что вы не можете использовать типы массивов в качестве свойств, поскольку компилятор не может synthesize метод, который возвращает тип массива.

Массивы C автоматически преобразуются в типы указателей при использовании в выражении, так что вы можете следовать совету @ Грэма и вместо этого использовать указатели.Недостатком этого подхода является то, что вы должны точно знать, сколько элементов в массиве, чтобы вы случайно не прочитали его конец.Если количество элементов фиксировано и известно во время компиляции, это, вероятно, путь (если вы хотите избежать NSArray по любой причине).

Трудно ответить, почему не удалось memsetдля компиляции, фактически не видя, как вы ее использовали, но, вообще говоря, вот как это можно использовать:

MyStruct someStructs[10];

memset(someStructs, 0, sizeof someStructs);

В качестве альтернативы, можно возвращать структуры из функций / методов, даже если они содержат массивы.Теоретически, вы можете создать структуру, содержащую массив MyStruct, и использовать этот новый тип структуры в качестве типа свойства.С практической точки зрения, это не очень хорошая идея, поскольку она просто добавляет уровень сложности.

1 голос
/ 25 октября 2010

Если у вас есть это:

@interface MyClass
{
    struct MyStruct foo[5];
}
@end

, вы вообще не можете иметь свойство чтения / записи.Вы можете объявить свойство только для чтения

@property (readonly, assign) struct MyStruct* fooProperty;

, которое даст вам указатель на массив.Тем не менее, это, вероятно, плохо, поскольку он предоставляет остальной части вашего кода внутренний доступ к структуре MyClass.Возможно, лучше реализовать индексированные средства доступа KVC , которые вам придется делать вручную.

0 голосов
/ 25 октября 2010

Вы, конечно, можете обращаться с массивом как со свойством, у него будет поведение «назначить», потому что вы не можете сохранить структуру. По сути, вы по-прежнему полностью ответственны за выделение памяти для массива.

Другой вариант - заменить структуру на объект. Затем он более естественно работает с механизмом свойств и открывает для вас классы коллекции Foundation, такие как NSArray.

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