Objective-C Language
Структуры
Поиск…
Синтаксис
- 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.