Поиск…


Синтаксис

  • typedef struct { typeA propertyA ; typeB свойствоB ; ...} StructName

замечания

В Objective C вы должны почти всегда использовать объект вместо структуры. Однако все еще есть случаи, когда использование структуры лучше, например:

  • Когда вы собираетесь создавать и уничтожать множество значений типа (struct), вам нужна хорошая производительность и малая память.
  • Структуры быстрее создавать и использовать, потому что при вызове метода на объекте метод должен определяться во время выполнения
  • Структуры занимают меньше размера, потому что объекты имеют дополнительное свойство isa , которое удерживает их класс
  • Когда значение имеет только пару свойств и небольшой общий размер (возьмите CGSize , у него есть 2 поплавка, каждый из которых имеет 4 байта, поэтому он может занимать до 8 байтов), и он будет использоваться много (связывается с первая точка)
  • Когда вы можете использовать союзы или битовые поля , и, что важно, нужен размер, сохраненный ими, потому что вам нужно небольшое использование памяти (привязка к первой точке)
  • Когда вы действительно хотите сохранить массив внутри структуры, поскольку объекты Objective-C не могут напрямую хранить C-массивы. Однако обратите внимание, что вы все равно можете «косвенно» получить массив в объекте Objective-C, сделав его ссылкой (т. Е. type * вместо типа C-массива type[] )
  • Когда вам нужно общаться с каким-либо другим кодом, например с библиотекой, закодированной на C; структуры полностью реализованы в C, но объекты не

CGPoint

Одним из действительно хороших примеров структуры является CGPoint ; это простое значение, представляющее двумерную точку. Он имеет 2 свойства, x и y и может быть записан как

typedef struct {
    CGFloat x;
    CGFloat y;
} CGPoint;

Если раньше вы использовали Objective-C для разработки приложений для Mac или iOS, вы почти наверняка встретили CGPoint ; CGPoint s удерживает положение почти всего на экране, от представлений и элементов управления до объектов в игре до изменений в градиенте. Это означает, что CGPoint используются много. Это даже более верно для действительно тяжелых игр; эти игры, как правило, имеют много объектов, и все эти объекты нуждаются в позициях. Эти позиции часто представляют собой CGPoint s или какой-либо другой тип структуры, который передает точку (например, трехмерную точку для 3D-игр).


Такие точки, как CGPoint могут быть легко представлены как объекты, например

@interface CGPoint {
    CGFloat x;
    CGFloat y;
}

... //Point-related methods (e.g. add, isEqualToPoint, etc.)

@property(nonatomic, assign)CGFloat x;
@property(nonatomic, assign)CGFloat y;

@end

@implementation CGPoint

@synthesize x, y;

...

@end

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

Определение структуры и доступа к членам структуры

Формат инструкции struct следующий:

struct [structure tag]
{
   member definition;
   member definition;
   ...
   member definition;
} [one or more structure variables]; 

Пример: объявить структуру ThreeFloats:

   typedef struct {
    float x, y, z;
} ThreeFloats;

@interface MyClass
- (void)setThreeFloats:(ThreeFloats)threeFloats;
- (ThreeFloats)threeFloats;
@end

Отправка экземпляра MyClass сообщения valueForKey: с параметром @ "threeFloats" вызывается метод MyClass threeFloats и возвращает результат, завернутый в NSValue.



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow