This is an incredibly difficult topic to address without going very deep into the functionality of the Objective-C runtime.
The short answer: When you instantiate an object, only that object is actually created.
When we use the word ‘instantiate’, we mean that memory is being allocated by the system to store an object, such as an NSString instance. An object is instantiated when its class is sent the +alloc message. The header file is nothing more than a place to describe what it means to be an instance of a given class. That is, any time a new object is instantiated, it will contain certain instance variables, such as ints, floats, and pointers (to other objects) as declared in its class’ header file. That is, you could define a class called Dog, give your Employee a pointer to one in Employee.h, but when your application is running, there are no actual instances of dog in your application until code such as
hisDog = [[Dog alloc] init]; is executed.
Brianpx, the reason that you see additional isa pointers beyond NSObject in the hierarchy in your picture is due to the deep rabbit-hole that is the Objective-C runtime. Specifically, that each class (such as NSString) is itself an object, and that each class is really a pair of two classes: a Class (with a capital C), and its meta-class. If this information has left your brain intact (mine was in pieces the first time I learned it), then there’s lots of additional reading on the subject here and here and here. Otherwise, I recommend saving these links until you’ve got a bit more Objective-C under your belt.