Objective-C Language
Estructuras
Buscar..
Sintaxis
- typedef struct { typeA propertyA ; typeB propertyB ; ...} StructName
Observaciones
En el Objetivo C, casi siempre debes usar un objeto en lugar de una estructura. Sin embargo, todavía hay casos en los que es mejor usar una estructura, como:
- Cuando vaya a crear y destruir muchos valores del tipo (estructura), necesitará un buen rendimiento y un pequeño uso de memoria.
- Las estructuras son más rápidas de crear y usar porque al llamar a un método en un objeto, el método debe determinarse en tiempo de ejecución
- Las estructuras ocupan menos tamaño porque los objetos tienen una propiedad extra
isa
, que mantiene su clase
- Cuando el valor solo tiene un par de propiedades y un tamaño total pequeño (tome
CGSize
; tiene 2 flotadores que tienen 4 bytes cada uno, por lo que puede ocupar 8 bytes), y se usará mucho (se vincula con el primer punto) - Cuando podría usar uniones o campos de bits y, lo que es más importante, necesita el tamaño guardado por ellos porque necesita un pequeño uso de memoria (concuerda con el primer punto)
- Cuando realmente desea almacenar una matriz dentro de la estructura, ya que los objetos Objective-C no pueden almacenar directamente las matrices-C. Sin embargo, tenga en cuenta que todavía puede obtener "indirectamente" una matriz en un objeto Objective-C al convertirla en una referencia (es decir,
type *
en lugar deltype[]
matriz Ctype[]
) - Cuando necesita comunicarse con algún otro código, como una biblioteca, se codifica en C; Las estructuras están completamente implementadas en C, pero los objetos no están
CGPoint
Un ejemplo realmente bueno de una estructura es CGPoint
; Es un valor simple que representa un punto bidimensional. Tiene 2 propiedades, x
y y
, y puede ser escrito como
typedef struct {
CGFloat x;
CGFloat y;
} CGPoint;
Si usó anteriormente Objective-C para el desarrollo de aplicaciones Mac o iOS, es casi seguro que se haya topado con CGPoint
; CGPoint
mantiene la posición de casi todo en la pantalla, desde vistas y controles a objetos en un juego hasta cambios en un degradado. Esto significa que los CGPoint
se usan mucho. Esto es aún más cierto con juegos realmente pesados; Estos juegos tienden a tener muchos objetos, y todos estos objetos necesitan posiciones. Estas posiciones suelen ser CGPoint
o algún otro tipo de estructura que transmite un punto (como un punto tridimensional para juegos 3D).
Puntos como CGPoint
podrían representarse fácilmente como objetos, como
@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
Sin embargo, si CGPoint
se usara de esta manera, tomaría mucho más tiempo crear y manipular puntos. En programas más pequeños y rápidos, esto realmente no causaría una diferencia, y en esos casos sería correcto o incluso mejor usar puntos de objeto. Pero en los programas grandes donde los puntos se usan mucho, usar objetos como puntos realmente puede afectar el rendimiento, hacer que el programa sea más lento y también desperdiciar memoria, lo que podría forzar al programa a fallar.
Definición de una estructura y acceso a los miembros de la estructura
El formato de la sentencia struct es este:
struct [structure tag]
{
member definition;
member definition;
...
member definition;
} [one or more structure variables];
Ejemplo: declarar la estructura de ThreeFloats:
typedef struct {
float x, y, z;
} ThreeFloats;
@interface MyClass
- (void)setThreeFloats:(ThreeFloats)threeFloats;
- (ThreeFloats)threeFloats;
@end
Al enviar una instancia de MyClass, el mensaje valueForKey: con el parámetro @ "threeFloats" invocará el método MyClass threeFloats y devolverá el resultado envuelto en un NSValue.