Un principi fonamental de la programació orientada a objectes és que les estructures de dades d'un objecte són privades a l'objecte. La informació emmagatzemada allí només pot accedir-se a través de missatges enviats a l'objecte. Encara que això generalment es considera una pràctica de programació dolenta, hi ha una forma per extreure una estructura de dades d'objecte dels seus "senseObjectes" i tractar-los com qualsevol altre estructura de C. Això fa que les variables d'instància dels objectes estiguin disponibles públicament.
Quan es dona un nom de classe com a argument, la directiva @defs() produeix la llista de declaracions per una instància de la classe. Aquesta llista només s'utilitza per declarar estructures, aixó @defs() pot només pot apareixer en el cos d'una declaració d'estructura. Aquest codi, per exemple, declara una estructura que és idèntica a la plantilla per una instància de la classe Treballador:
struct defTreballador {
@defs(Treballador)
} *public;
Aquí public està declara com un punter a una estructura que és esencialment indistingible de la instància Treballador. Amb una mica d'ajuda de indicació de tipus, un id Treballador pot assignar-se al punter. Les variables d'instància dels objectes poden llavors accedir-se publicament a través del punter:
id unTreballador;
unTreballador = [[Treballador alloc] init];
public = (struct defTreballador *)unTreballador;
public->cap = nil;
Aquesta tècnica per possar un objecte dins una estructura fa que totes les seves variables d'instància sigui públiques, encara que estiguin declarades @private, @protected o @public.
Els objectes generalment no estan dissenyats amb l'expectativa que es situin dins estructures de C. Pots voler utilitzar @defs() per classes que defineixes completament per a tu, però això no s'hauria d'aplicar a les classes que es troben en un marc de treball o a classes que defineixes heredades des de classes del marc de treball.